在我们日常生活中,经常会遇到一些事情:买卖商品,在我们去商店买东西的时候,我们一般都会先咨询商自己需要的物品,然后商家在去仓库取货。去买手机的时候,我们一定会去手机店买,而不是直接去手机产地购买手机。等等诸多类似的事情。仔细分析,你就会发先,他们都有一个共同二队特点,就是客户并没有跟原产地直接接触,而是通过一个称之为“代理”的第三者在间接实现。代理对象在客户和目标对象直接起到了中介的作用,并且可以通过代理对象去调用客户看不见的内容和服务。
代理模式的定义如下:给某一个对象提供一个代理,并由代理对象控制对原对象的引用,代理模式的英文名为:Proxy,它是一种对象结构型模式。
Proxy :是一个接口(或者抽象类 )。该接口是对象和它的代理所共用的接口
User : 真实主题角色,是实现接口(或抽象类)的类,是真实对象
MyProxy :代理角色,内部包含对真实对象 User 的引用,从而实现可操作的真实对象,它们共同实现了 Proxy ,是“has” 的关系,以便在任何时刻都能替换真实对象 ,同时,代理对象可以在执行真实对象操作时附加 其他的操作,相当于对真实对象进行封装。
ProxyDAO .java
public interface ProxyDAO {
public void update(Object obj);
}
MyProxy.java
public class MyProxy implements ProxyDAO{
ProxyDAO proxyDAO;
public void setProxy(ProxyDAO proxyDAO) {
this.proxyDAO =proxyDAO ;
}
@Override
public void update(Object obj) {
System.out.println("更新。。。");
proxyDAO.update(obj);
}
}
User.java
public class User implements ProxyDAO{
@Override
public void update(Object obj) {
System.out.println("User更新数据。。。");
}
}
Test.java
public class Test {
public static void main(String[] args) {
MyProxy proxyDao = new MyProxy();
proxyDao.setProxy(new User());
proxyDao.update(1);
}
}
测试结果如下:
从这里我们就可以发现,我们并没有直接的操作User类就可以实现了它的方法,非常符合设计模式中的开闭原则(对修改关闭,对扩展开放),我们就可以在不改变原有的基础上,增加类似于User类的对象,在实现Proxy接口,就能对其进行间接操作。