代理模式:为其他对象提供一种代理以控制对这个对象的访问。 解释:举例来说,你想在美国买iphone6,但是你没有到美国去,恰巧你有一朋友到美国出差,于是你让朋友帮忙代买iphone6.整个过程就是代理模式,你是目标对象,你朋友作为代理,代你完成你想进行的操作。
首先定义一个接口用来表示需要代理的动作
public interface Request {
public void getIphone();
}
然后实现我要买iphone这个功能
public class Buyer implements Request {
@Override
public void getIphone() {
System.out.println("I want to buy iphone");
}
}
但是iphone毕竟不是我买的,是朋友帮我买的,所以需要一个代理来代我买
public class Proxy implements Request {
private Buyer buyer;
public Proxy(Buyer buyer) {
this.buyer = buyer;
}
@Override
public void getIphone() {
buyer.getIphone();
}
}
测试代码如下:
public static void main(String[] args) {
Buyer buyer = new Buyer();
Proxy proxy = new Proxy(buyer);
proxy.getIphone();
}
代理模式到底好处在哪里呢?? 那先要说一下代理模式中的三种角色了。 抽象角色:声明真实对象和代理对象的共同接口。也就是代理人和被代理人共同的功能 真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。 代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
代理模式的一个好处就是对外部提供统一的接口方法,而代理类在接口中实现对真实类的附加操作行为,从而可以在不影响外部调用情况下,进行系统扩展。也就是说,我要修改真实角色的操作的时候,尽量不要修改他,而是在外部在“包”一层进行附加行为,即代理类。例如:接口A有一个接口方法operator(),真实角色:RealA实现接口A,则必须实现接口方法operator()。客户端Client调用接口A的接方法operator()。现在新需求来了,需要修改RealA中的operator()的操作行为。怎么办呢?如果修改RealA就会影响原有系统的稳定性,还要重新测试。这是就需要代理类实现附加行为操作。创建代理ProxyA实现接口A,并将真实对象RealA注入进来。ProxyA实现接口方法operator(),另外还可以增加附加行为,然后调用真实对象的operator()。从而达到了“对修改关闭,对扩展开放”,保证了系统的稳定性。我们看客户端Client调用仍是接口A的接口方法operator(),只不过实例变为了ProxyA类了而已。也就是说代理模式实现了开闭原则。
参考:http://www.cnblogs.com/BeyondAnyTime/archive/2012/07/04/2576865.html