静态代理
三个角色
静态代理的条件至少有三个角色
- 真实角色(RealObject)
- 代理角色(ProxyObject)
- 接口这三个(AbstractObject)
要求
- 真实角色与代理角色实现相同的接口。
- 代理类要持有真实角色的引用。 重点:真实角色、代理角色、接口的关系。代理接口实际上是抽象出所有真实角色的共有方法。
用法
1.创建真实角色 2.创建代理角色 3.代理角色.方法()。
注意:代理模式是要让代理类来使用委托类,所以是通过 new 代理类,在代理类中使用委托类,有点像回调函数的用法。
测试方法
代码语言:javascript复制/**
* 功能描述:测试
* @author liukai
* @date 2015年11月13日 下午3:47:33
* @version 1.0
*/
public class Test {
public static void main(String[] args) {
ServiceImpl serviceImpl = new ServiceImpl();
IService iService = (IService) Proxy.getInstance(serviceImpl);
iService.say();
}
}
代理类
代码语言:javascript复制/**
* 功能描述:代理类
* @author liukai
* @date 2015年11月13日 下午3:47:19
* @version 1.0
*/
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);
}
}
实现类
代码语言:javascript复制/**
* 功能描述:实现类
* @author liukai
* @date 2015年11月13日 下午3:47:27
* @version 1.0
*/
public class ServiceImpl implements IService{
public ServiceImpl() {
// TODO Auto-generated constructor stub
}
@Override
public void say() {
System.out.println("ServiceImpl.say()");
}
}
接口
代码语言:javascript复制/**
* 功能描述:接口
* @author liukai
* @date 2015年11月13日 下午3:47:06
* @version 1.0
*/
public interface IService {
public abstract void say();
}
静态代理类优缺点
- 优点:业务类只需要关注业务逻辑本身,保证了业务类的重用性。这是代理的共有优点。
- 缺点:
- 代理对象的一个接口只服务于一种类型的对象,如果要代理的方法很多,势必要为每一种方法都进行代理,静态代理在程序规模稍大时就无法胜任了。
- 如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。