静态代理
三个角色
静态代理的条件至少有三个角色
- 真实角色(RealObject)
- 代理角色(ProxyObject)
- 接口这三个(AbstractObject)
要求
- 真实角色与代理角色实现相同的接口。
- 代理类要持有真实角色的引用。
重点:真实角色、代理角色、接口的关系。代理接口实际上是抽象出所有真实角色的共有方法。
用法
1.创建真实角色
2.创建代理角色
3.代理角色.方法()。
注意:代理模式是要让代理类来使用委托类,所以是通过 new 代理类,在代理类中使用委托类,有点像回调函数的用法。
测试方法
1 2 3 4 5 6 7 8 9 10 11 12 13
|
public class Test { public static void main(String[] args) { ServiceImpl serviceImpl = new ServiceImpl(); IService iService = (IService) Proxy.getInstance(serviceImpl); iService.say(); } }
|
代理类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
public class Proxy implements IService{ private IService iService; public Proxy() { } public Proxy(IService iService) { this.iService = iService; } @Override public void say() { System.out.println("Proxy.say()"); iService.say(); } public static IService getInstance(ServiceImpl object) { return new Proxy(object); } }
|
实现类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
public class ServiceImpl implements IService{ public ServiceImpl() { } @Override public void say() { System.out.println("ServiceImpl.say()"); } }
|
接口
1 2 3 4 5 6 7 8 9
|
public interface IService { public abstract void say(); }
|
静态代理类优缺点
优点:业务类只需要关注业务逻辑本身,保证了业务类的重用性。这是代理的共有优点。
缺点:
代理对象的一个接口只服务于一种类型的对象,如果要代理的方法很多,势必要为每一种方法都进行代理,静态代理在程序规模稍大时就无法胜任了。
如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。