设计模式-代理模式 静态代理模式

2023-10-20 10:25:11 浏览数 (1)

静态代理

三个角色

静态代理的条件至少有三个角色

  1. 真实角色(RealObject)
  2. 代理角色(ProxyObject)
  3. 接口这三个(AbstractObject)

要求

  1. 真实角色与代理角色实现相同的接口。
  2. 代理类要持有真实角色的引用。 重点:真实角色、代理角色、接口的关系。代理接口实际上是抽象出所有真实角色的共有方法。

用法

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();
}

静态代理类优缺点

  1. 优点:业务类只需要关注业务逻辑本身,保证了业务类的重用性。这是代理的共有优点。
  2. 缺点:
  3. 代理对象的一个接口只服务于一种类型的对象,如果要代理的方法很多,势必要为每一种方法都进行代理,静态代理在程序规模稍大时就无法胜任了。
  4. 如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。

0 人点赞