代理模式有三个角色
代理模式一般涉及到的角色有:
抽象角色:声明真实对象和代理对象的共同接口(这里卖电脑);
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装(电脑代理商可以卖电脑,同时为了吸引顾客可能还要附送一些赠品,这里暂定为鼠标)。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象(代理商本身是没有电脑的,这里的真实角色是厂家ComputerMaker)。
这里是基于Java的代理模式,所以只能是接口代理,下面是抽象角色
接下来是真实角色
代理机制
测试,创建代理商实例
代理模式一般涉及到的角色有:
抽象角色:声明真实对象和代理对象的共同接口(这里卖电脑);
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装(电脑代理商可以卖电脑,同时为了吸引顾客可能还要附送一些赠品,这里暂定为鼠标)。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象(代理商本身是没有电脑的,这里的真实角色是厂家ComputerMaker)。
这里是基于Java的代理模式,所以只能是接口代理,下面是抽象角色
public interface SaleComputer {
public abstract void saleComputer(String type);//卖电脑
}
接下来是真实角色
public class ComputerMaker implements SaleComputer {//厂家出售电脑
private Logger log = Logger.getLogger(this.getClass().getName());
public void saleComputer(String type) {
log.info("computermaker sale computers("+type+")....");
}
}
代理机制
public class FunctionProxy implements InvocationHandler {//代理后
private Object delegate;
private Logger logger = Logger.getLogger(this.getClass().getName());
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object o = null;
o=method.invoke(delegate, args);
giveMouse();
return o;
}
public FunctionProxy(Object delegate){
this.delegate = delegate;
}
private void giveMouse(){
logger.info("赠送鼠标.....");
}
}
测试,创建代理商实例
public class TestProxy {
public static void main(String[] args) {
SaleComputer sc = new ComputerMaker();
InvocationHandler handler = new FunctionProxy(sc);
SaleComputer proxy = (SaleComputer) Proxy.newProxyInstance(sc.getClass().getClassLoader(),
sc.getClass().getInterfaces(), handler);//创建代理商实例
proxy.saleComputer("LENEVO");//代理商卖电脑
}
}
输出结果
信息: computermaker sale computers(LENEVO)....
信息: 赠送鼠标.....