一,定义
代理模式:为其他对象提供一种代理以控制对这个对象的访问。
二,分类
1,远程代理:就是为一个对象在不同地址空间提供局部代表,这样就可以隐藏一个对象存在于不同地址空间的事实。
2,虚拟代理:是根据需要创建开销很大的对象,通过他来存放实例化需要很长时间的真是对象。
3,安全代理:用来控制真实对象访问时的权限。
4,智能指引:是指当调用真实对象时,代理处理另外一些事。
三,角色
1, 抽象角色:声明真实对象和代理对象的共同接口。
2, 代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
3, 真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
四,实例
下面我们将实现一个最求者通过代理来给被追求者送礼物的例子
public interface GiveGift {
//实现一个通过追求者通过代理人送礼物给被追求者的例子
void giveDolls();
void giveFlowers();
void giveChocolate();
}
//追求者
public class Pursuit implements GiveGift{
private Girl mm;
public Pursuit(Girl girl){
this.mm = girl;
}
@Override
public void giveDolls() {
System.out.println("追求者送洋娃娃给" + mm.name);
}
@Override
public void giveFlowers() {
System.out.println("追求者送鲜花给" + mm.name);
}
@Override
public void giveChocolate() {
System.out.println("追求者巧克力给" + mm.name);
}
}
//代理人
public class Proxy implements GiveGift{
private Pursuit pursuit;
public Proxy(Girl girl){
pursuit = new Pursuit(girl);
}
@Override
public void giveDolls() {
pursuit.giveDolls();
}
@Override
public void giveFlowers() {
pursuit.giveFlowers();
}
@Override
public void giveChocolate() {
pursuit.giveChocolate();
}
}
//被追求者
public class Girl {
public String name;
}
//测试
//代理模式
Girl girl = new Girl();
girl.name = "娇娇";
Proxy proxy = new Proxy(girl);
proxy.giveDolls();
proxy.giveFlowers();
proxy.giveChocolate();
输出:
追求者送洋娃娃给娇娇
追求者送鲜花给娇娇
追求者巧克力给娇娇
五,优缺点
优点:
业务类只需要关注业务逻辑本身,保证了业务类的重用性。这是代理的共有优点。 能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。
缺点:
由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢,例如保护代理。
实现代理模式需要额外的工作,而且有些代理模式的实现过程较为复杂,例如远程代理。
参考:《大话设计模式》 阿木侠 Java知音