设计模式-代理模式-Proxy
代理(Proxy)顾名思义:为避免2者之间直接接触,委托方寻求第三方(代理方)帮忙处理一些委托方的需求。最经典的例子就是打官司:委托方就是被代理方,律师就是代理方,律师的职责就是避免原被告直接接触。
一、使用场景
如果2者之间需要通信,且2者之间必须解耦,需引入一个三方类来预处理通信、和通信结果处理。这个三方类就是代理类。二、静态代理方式
代理类能完全控制对委托对象的直接访问,也可以保护委托对象不被直接访问,同时也预留了通信处理空间,在设计上有更大的灵活性。
1、被代理者
/**
* 作者: Created by AdminFun
* 邮箱: 614484070@qq.com
* 创建: 2019/1/4
* 修改: 2019/1/4
* 版本: v1.0.0
* 描述: 被代理者
*/
public class CS35Info implements ICar {@Override
public double getPrice() {
return 90000;
}@Override
public String getModel() {
return "长安CS35";
}
}
2、静态代理
/**
* 作者: Created by AdminFun
* 邮箱: 614484070@qq.com
* 创建: 2019/1/4
* 修改: 2019/1/4
* 版本: v1.0.0
* 描述: 静态代理
* * 静态代理的写法和装饰器有点类似,区别在于:
* 1、代理的构造传入的是实例,而装饰器构造传入的是抽象
* 2、代理想要控制实例的访问权限,而装饰意在控制对象的行为
*/
public class ProxyStatic implements ICar {private CS35Info cs35Info;
public ProxyStatic(CS35Info cs35Info) {
this.cs35Info = cs35Info;
}@Override
public double getPrice() {
return cs35Info.getPrice();
}@Override
public String getModel() {
return cs35Info.getModel();
}
}
3、调用
/**
* 作者: Created by AdminFun
* 邮箱: 614484070@qq.com
* 创建: 2019/1/4
* 修改: 2019/1/4
* 版本: v1.0.0
*/
public class ProxyTest {public static void main() {
// 静态代理
ProxyStatic proxyStatic = new ProxyStatic(new CS35Info());
Log.d("common", "静态代理:" + proxyStatic.getModel());
}
}
三、动态代理
【设计模式-代理模式-Proxy】被代理方还是上面的被代理类,这里不再重写。
1、动态代理
/**
* 作者: Created by AdminFun
* 邮箱: 614484070@qq.com
* 创建: 2019/1/4
* 修改: 2019/1/4
* 版本: v1.0.0
* 描述:动态代理
* 动态代理和静态代理的区别
* 1、静态代理需要代理方和委托方都实现相同的接口,接口方法变动后,双方都要随着变动,代码维护成本增加。
* 2、动态代理是利用反射机制,可代理任何对象,且不需要维护成本。
*/
public class ProxyDynamic implements InvocationHandler {private Object target;
//被代理的对象public ProxyDynamic(Object obj) {
this.target = obj;
}@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(target, args);
}
}
2、调用
/**
* 作者: Created by AdminFun
* 邮箱: 614484070@qq.com
* 创建: 2019/1/4
* 修改: 2019/1/4
* 版本: v1.0.0
*/
public class ProxyTest {public static void main() {
// 动态代理
final ICar car = new CS35Info();
// 方式1
ICar proxy = (ICar) Proxy.newProxyInstance(
car.getClass().getClassLoader(),
car.getClass().getInterfaces(),
new ProxyDynamic(car)
);
// 方式2
ICar proxy1 = (ICar) Proxy.newProxyInstance(
car.getClass().getClassLoader(),
car.getClass().getInterfaces(),
new InvocationHandler() {@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(car, args);
}
});
Log.d("common", "动态代理:" + proxy1.getModel());
}
}
推荐阅读
- 事件代理
- --木木--|--木木-- 第二课作业#翼丰会(每日一淘6+1实战裂变被动引流# 6+1模式)
- 【译】Rails|【译】Rails 5.0正式发布(Action Cable,API模式等)
- java静态代理模式
- VueX(Vuex|VueX(Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式)
- Kotlin基础(10)-代理模式在kotlin中的使用
- 长谈的确是这个时代需要的一种模式
- 《读_Head_First_有感》_“命令模式”
- 洗洗睡了|洗洗睡了 | 休息的时候,千万注意切换你的行为模式
- 设计模式【15】--从审批流中学习责任链模式