代理模式
package syc;
public class Proxy implements Subject{
private RealSubject realsubject;
public Proxy(RealSubject realsubject) {
this.realsubject = realsubject;
}
@Override
public void request() {
realsubject.request();
}
}
*********
package syc;
public class RealSubject implements Subject {
@Override
public void request() {
// TODO Auto-generated method stub
System.out.println("真实的请求!");
}
}
*********
package syc;
public interface Subject {
public void request();
}
********
package syc;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
RealSubject realsubject=new RealSubject();
Proxy proxy=new Proxy(realsubject);
proxy.request();
}
}
本质
控制对象访问
应用场景
建议在如下情况中,选用代理模式:
- 需要为一个对象在不同的地址空间提供局部代表的时候,可以使用远程代理
- 需要按照需要创建开销很大的对象的时候,可以使用虚代理
- 需要控制对原始对象的访问的时候,可以使用保护代理
- 需要在访问对象的时候执行一些附加操作的时候,可以使用智能指引代理
相关模式
代理模式和适配器模式
这两个模式有一定的相似性,但也有差异。
这两个模式有相似性,它们都为另一个对象提供间接性的访问,而且都是从自身以外的一个接口向这个对象转发请求。
但是从功能上,两个模式是不一样的。适配器模式主要用来解决接口之间不匹配的问题,它通常是为所适配的对象提供一个不同的接口;而代理模式会实现和目标对象相同的接口。
l 代理模式和装饰模式
这两个模式从实现上相似,但是功能上是不同的。
装饰模式的实现和保护代理的实现上是类似的,都是在转调其它对象的前后执行一定的功能。但是它们的目的和功能都是不同的。
装饰模式的目的是为了让你不生成子类就可以给对象添加职责,也就是为了动态的增加功能;而代理模式的主要目的是控制对对象的访问。
//代理送洋娃娃
package syc;
public interface GiveGifts {
public void giveDolls();
public void giveFlowers();
public void giveChocolate();
}
*********
package syc;
public class Proxy implements GiveGifts {
Pursuit gg;
public Proxy(SchoolGirl mm) {
gg=new Pursuit(mm);
}
@Override
public void giveDolls() {
// TODO Auto-generated method stub
gg.giveDolls();
}
@Override
public void giveFlowers() {
// TODO Auto-generated method stub
gg.giveFlowers();
}
@Override
public void giveChocolate() {
// TODO Auto-generated method stub
gg.giveChocolate();
}
}
*********
package syc;
public class Pursuit implements GiveGifts {
SchoolGirl mm;
public Pursuit(SchoolGirl mm) {
super();
this.mm = mm;
}
@Override
public void giveDolls() {
// TODO Auto-generated method stub
System.out.println(mm.name+"送你洋娃娃!");
}
@Override
public void giveFlowers() {
// TODO Auto-generated method stub
System.out.println(mm.name+"送你鲜花!");
}
@Override
public void giveChocolate() {
// TODO Auto-generated method stub
System.out.println(mm.name+"送你巧克力!");
}
}
*******
package syc;
public class SchoolGirl {
public String name;
public SchoolGirl(String name) {
this.name = name;
}
}
*******
package syc;
public class Main {
public static void main(String[] args) {
SchoolGirl jiaojiao=new SchoolGirl("李娇娇");
Proxy daili=new Proxy(jiaojiao);
daili.giveDolls();
daili.giveFlowers();
daili.giveChocolate();
}
}