抽象主题(Subject)角色:这是一个抽象角色,通常被定义为接口,真实主题角色和代理主题角色都需实现此接口,
以便将来可以使用代理主题对象来替代真实主题对象。
public interface Static { String request(); }
真实主题(RealSubject)角色:也叫被代理角色,是代理主题角色所代表的真实对象,是业务逻辑的实际执行者。
public class StaticImpl implements Static { public StaticImpl(){ } @Override public String request() { return "请求进来...."; } }
代理主题(Proxy)角色:也叫代理角色,该角色内部含有对真实主题对象的引用,从而可以操作真实主题对象,
同时代理对象提供与真实主题对象相同的接口以便在任何时刻都能代替真实主题对象。
通常代理角色会在将客户端调用传递给真实主题对象之前或者之后执行某些操作,
而不是单纯地将调用传递给真实主题对象。
public class StaticProxy implements Static { private StaticImpl staticImpl = null; @Override public String request() { System.out.println("Before....."); //在真正需要的时候才能创建真实对象,创建过程可能很慢 if(staticImpl == null){ staticImpl = new StaticImpl(); }//在多线程环境下,这里返回一个虚假类,类似于 Future 模式 String result = staticImpl.request(); System.out.println(result); System.out.println("After....."); return result; } }
测试:
public class Test { /** * 主题接口是Static,真实主题是StaticImpl 实现了Static接口, * * 代理类是StaticProxy,在代理类的方法里实现了StaticImpl类,并且在代码里写死了代理前后的操作 * * 静态代理的优缺点: * * 优点: * * 使得真实主题处理的业务更加纯粹,不再去关注一些公共的事情,公共的业务由代理来完成,实现业务的分工,公共业务发生扩展时变得更加集中和方便。 * * 缺点: * * 这种实现方式很直观也很简单,但其缺点是代理类必须提前写好,如果主题接口发生了变化,代理类的代码也要随着变化,有着高昂的维护成本。 */ public static void main(String[] args) { Static s = new StaticProxy();//使用代理 s.request();//在真正使用时才创建真实对象 } }