一、应用场景
在我们现实场景中,如果某个人工作非常繁忙,无法处理某些事情。这时候,我们就可以找代理人来处理我们没有时间处理的问题。代理人怎么知道我们会做什么?不会做什么呢?这就要保证我们和代理人沟通,保证我们和代理人的行为是一致的。这就保证了代理人不会做那些超过我们能力范围的事情。代理模式也一样,代理类和被代理类同时实现一个接口,保证代理类和被代理类的行为是保持一致的。在代理类里面实现了被代理类的实例,调用了被代理类的方法。这样,在外界看来,代理类处理了被代理类的功能。
二、优缺点
优点:业务类只需要关注业务逻辑本身,保证了业务类的重用性。这是代理的共有优点。
缺点:
1)代理对象的一个接口只服务于一种类型的对象,代理方法一多,代理就会很繁杂。
2)如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。
三、具体代码
1、接口类
package com.wcb.beijing.proxy;
//代理
public interface KindWomen {
public void makeEyesWithMen();
public void makeHappyWithMen();
}
2、被代理类
package com.wcb.beijing.proxy;
public class PanJinLian implements KindWomen {
@Override
public void makeEyesWithMen() {
System.out.println("潘金莲抛媚眼");
}
@Override
public void makeHappyWithMen() {
System.out.println("潘金莲出轨了...");
}
}
3、代理类
package com.wcb.beijing.proxy;
public class WangPo implements KindWomen {
private KindWomen kindWomen;
public WangPo(){
kindWomen = new PanJinLian();
}
public WangPo(KindWomen kindWomen){
this.kindWomen = kindWomen;
}
@Override
public void makeEyesWithMen() {
kindWomen.makeEyesWithMen();
}
@Override
public void makeHappyWithMen() {
kindWomen.makeHappyWithMen();
}
}
4、测试类
package com.wcb.beijing.proxy;
public class XiMenQing {
public static void main(String[] args) {
WangPo wangPo = new WangPo();
wangPo.makeEyesWithMen();
wangPo.makeHappyWithMen();
}
}
注:本文示例来自设计模式之禅