代理模式,很好理解,提供一个中间件,通过这个中间件去访问我们需要访问的对象
代理模式的作用是:
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式一般需要以下几个角色:
抽象角色:声明真实对象和代理对象的共同接口;
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
下面的例子,我们以李某触犯法律,他现在正在接收审判,但是他怕说错话,就请了一个律师来帮他:
先定义抽象角色,不管是李某还是律师,他们都有说话这个方法
interface speak { void lispeak(); }真实角色李某实现了这个接口,他只告诉法官,他没有做坏事,其他事的由代理去做:
public class speakImpl implements speak{ public void lispeak() { System.out.println("我没有做坏事"); } }代理角色,律师,他除了要表达出李某的意思外,还可以表达自己的一些辩解行为
public class proxy implements speak{ private speakImpl si; public proxy(speakImpl si){ this.si = si; } @Override public void lispeak() { si.lispeak(); this.evidence(); this.proxyspeak(); } void proxyspeak(){ System.out.println("我的当事人保持沉默"); } void evidence(){ System.out.println("我的证据如下......"); } }好了,现在法官出场了,法官问:李某你知道你犯罪了吗?
public class faguan { public static void main(String[] args) { //法官问李某 speakImpl si = new speakImpl(); //李某不回答,由其代理来帮他回答 proxy p = new proxy(si); //代理开始说了 p.lispeak(); } }看见没,代理除了表达出了李某的的意思外,还可以表达自己的意见。
这就是java中的代理模式。从开闭原则来讲,律师他不仅可以代理李某,还可以代理张某,只要张某不是哑巴。
以上代码,打印出的结果是:
我没有做坏事
我的证据如下......
我的当事人保持沉默
爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情