代理模式
代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。
Subject类,定义了RealSubject和Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。
public interface Subject {
public void request();
}
RealSubject类,定义Proxy所代表的真实实体。
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("真实的请求");
}
}
Proxy类保存一个引用使得代理可以访问实体,并且提供一个与Subject的接口相同的接口,这样代理就可以用来替代实体,也就是说由代理来完成对RealSubject实体方法的访问,而不由调用者直接调用,这样相当于调用者不需要知道RealSubject只需要认识代理。
public class Proxy implements Subject {
private RealSubject realSubject;
@Override
public void request() {
if (realSubject == null) {
realSubject = new RealSubject();
}
realSubject.request();
}
public static void main(String[] args) {
Proxy proxy = new Proxy();
proxy.request();//真实的请求
}
}
下面介绍下《大话设计模式》关于代理模式的扯淡案例,有个女生叫李娇娇,有个男生喜欢她,想给她送礼物,但自己不好意思,就拜托他的朋友戴利去送,结果最后女生喜欢上他朋友了。
那么在这个案例中,这位朋友就成为了代理,追求者通过代理来送礼物给被追求者女生
被追求者类如下
public class SchoolGirl {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
需要由代理完成的动作,也就是送礼物抽象为功能接口
public interface GiveGift {
public void giveDools();
public void giveFlowers();
public void giveChocolate();
}
追求者和被追求者都需要实现GiveGift接口
public class Persuit implements GiveGift {
private SchoolGirl mm;
public Persuit(SchoolGirl mm) {
this.mm = mm;
}
@Override
public void giveDools() {
System.out.println(mm.getName() + "送你洋娃娃");
}
@Override
public void giveFlowers() {
System.out.println(mm.getName() + "送你鲜花");
}
@Override
public void giveChocolate() {
System.out.println(mm.getName() + "送你巧克力");
}
}
追求者的实例只有代理能够接触到,所以被追求者是不知道追求者实例的,只能知道代理的实例
public class PersuitProxy implements GiveGift {
private Persuit gg;
public PersuitProxy(SchoolGirl mm) {
this.gg = new Persuit(mm);
}
@Override
public void giveDools() {
gg.giveDools();
}
@Override
public void giveFlowers() {
gg.giveFlowers();
}
@Override
public void giveChocolate() {
gg.giveChocolate();
}
public static void main(String[] args) {
SchoolGirl jiaojiao = new SchoolGirl();
jiaojiao.setName("李娇娇");
PersuitProxy daili = new PersuitProxy(jiaojiao);
daili.giveFlowers();
daili.giveDools();
daili.giveChocolate();
}
}
参考资料
《大话设计模式》