代理模式:
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,
而代理对象可以在客户端和目标对象之间起到中介的作用。
比如:代理服务器、产品代理、工商代理、会计代理、房地产中介、职业中介等。
组成:
抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
这里是一个代理服务器的实现代理模式example code:
扫描二维码关注公众号,回复:
238439 查看本文章
抽象角色:
/** * 服务器 * Created by jiangzhq on 2015/6/23. */ public interface Server { public void service(); }
真实角色:提供真实的服务
/** * 外网服务器,提供访问境外服务 * Created by jiangzhq on 2015/6/23. */ public class InternetServer implements Server{ public void service() { System.out.println("外网服务器,提供访问境外服务"); } }
代理角色:代替真实角色执行动作,需要注入真实角色,有多种方法注入:构造函数、set方法等
/** * 代理服务器,除提供境外网站服务,还需要突破GFW封锁 * Created by jiangzhq on 2015/6/23. */ public class ProxyServer implements Server { InternetServer server; // 注入真实角色 public ProxyServer() { server = new InternetServer(); } public void service() { before(); server.service(); after(); } public void before(){ System.out.println("突破GFW封锁"); } public void after(){ System.out.println("使用代理服务器可以访问境外服务,是明智的选择"); } }
/** * 客户端测试类 * Created by jiangzhq on 2015/6/23. */ public class ProxyTest { public static void main(String[] args) { Server proxyServer = new ProxyServer(); proxyServer.service(); } }
代理模式的设计,是使用抽象类或接口作为“抽象角色”,每个“代理角色”代理一个“真实角色”。
使用代理模式,可以在不改变原有类的基础上,增加额外的功能,代码做到了无污染,低耦合,符合开闭原则。
本文的这种代码实现方式,是静态代理模式,虽然对原来代码无污染,但如果被代理的类数目多,会需要写很多的代理类代码,势必造成系统臃肿,使用动态代理可以解决这个问题,且看下一文 代理模式之动态代理 。