设计模式《代理模式》
2018-07-16 本文已影响0人
天道__
引言
上一节我们讲了观察者模式,这回咱们说说代理模式。
示例地址
类图
代理模式的定义
为其他对象提供一种代理以控制对这个对象的访问。
代理模式的使用场景
当无法或不想直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,委托对象与代理对象需要实现相同的接口。
代理模式的示例
代理模式挺简单的,就跟单例模式一样简单。我们日常冲话费都是支付宝或者微信。这里面微信或者支付宝就是代理。
静态代理
1. 充值接口
/**
* 话费充值接口
*
* @author 512573717@qq.com
* @created 2018/7/19 上午10:58.
*/
public interface IHuaFei {
void recharge ();
}
2. 充值实现
/**
* 充值实现
*
* @author 512573717@qq.com
* @created 2018/7/19 上午11:12.
*/
public class Recharge implements IHuaFei {
@Override
public void recharge() {
System.out.println("充值100元话费");
}
}
3. 支付宝代理
/**
* 支付宝代缴话费
*
* @author 512573717@qq.com
* @created 2018/7/19 上午11:12.
*/
public class ZhiFuBaoProxy implements IHuaFei {
private Recharge mRecharge;
public ZhiFuBaoProxy(Recharge recharge) {
mRecharge = recharge;
}
@Override
public void recharge() {
mRecharge.recharge();
}
}
4. Client调用
Recharge mRecharge = new Recharge();
ZhiFuBaoProxy mZhiFuBao = new ZhiFuBaoProxy(mRecharge);
mZhiFuBao.recharge();
动态代理
1. 动态代理类
/**
* 动态代理
*
* @author 512573717@qq.com
* @created 2018/7/19 上午11:33.
*/
public class DynamicProxy implements InvocationHandler {
private Object object;
public DynamicProxy(Object object) {
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(object, args);
return result;
}
}
2. Client
IHuaFei mIHuaFei = new Recharge();
DynamicProxy proxy = new DynamicProxy(mIHuaFei);
ClassLoader classLoader = mIHuaFei.getClass().getClassLoader();
IHuaFei huaFei = (IHuaFei) Proxy.newProxyInstance(classLoader, new Class[]{IHuaFei.class}, proxy);
huaFei.recharge();
总结
代理模式为的是对被代理对象提供访问控制,客户端关心的实际上还是被代理对象所具有的功能。