Android 最常用的设计模式十一 安卓源码分析—— 代理模式(proxy)
来源:互联网 发布:数据恢复软件二点零 编辑:程序博客网 时间:2024/06/05 17:36
如A要租房,为了省麻烦A会去找中介,中介会替代A去筛选房子,A坐享中介筛选的结果,并且交房租也是交给中介,这就是一个典型的日常生活中代理模式的应用.
http://blog.csdn.net/l2show/article/details/46992495
/** * 动态代理 * /** * 对于客户来说,完全不用跟House进行直接交互,这 * 里先定义一个房子叫唐顿庄园,租金5k,建立一个房屋代理, * 把唐顿庄园委托给代理.客户要找房子,签合同,付租金直接找代理就行了. */public void testDongtaiMode(){ ProxyHandler proxy = new ProxyHandler(); IHouse house = (IHouse) proxy.newProxyInstance(new House("Downton Abbey", 5000)); Log.i(TAG, "looking for a perfect house"); house.getHouseInfo(); Log.i(TAG, "thinking"); house.signContract(); house.payFees(); Log.i(TAG, "so easy");}
public class ProxyHandler implements InvocationHandler { private final String TAG = ProxyHandler.class.getSimpleName(); // 这个就是我们要代理的真实对象 Object targetObj; //构造方法,给我们要代理的真实对象赋初值 public Object newProxyInstance(Object targetObj) { this.targetObj = targetObj; return Proxy.newProxyInstance(targetObj.getClass().getClassLoader(), targetObj.getClass().getInterfaces(), this); } @Override public Object invoke(Object o, Method method, Object[] objects) throws Throwable { Object ret; //在代理真实对象前我们可以添加一些自己的操作 Log.i(TAG, "method name:" + method.getName()); //当代理对象调用真实对象的方法时,其会自动的跳转到代理对象关联的handler对象的invoke方法来进行调用 ret = method.invoke(targetObj, objects);//对象,还有操作方法的参数 //在代理真实对象后我们也可以添加一些自己的操作 System.out.println("after rent house"); return ret; }}
/** * Created by Administrator on 2017/9/14. * 接下来定义真实主题,并实现IHouse接口.增加房屋名称和价格两个属性,填充借口方法, * 在获取房屋信息的时候就把房屋名称和价格log出来;签合同的时候log出签合同的时间,付租金的时候log出价格. */public class House implements IHouse{ private final String TAG = House.class.getSimpleName(); private String name; private double price; public House(String name, double price){ this.name = name; this.price = price; } @Override public void getHouseInfo() { } @Override public void signContract() { } @Override public void payFees() { }}
/** * Created by Administrator on 2017/9/14. * 根据场景先定义一个抽象主题,IHouse,提供三个方法,分别是获取房屋信息,签合同和付租金. */public interface IHouse { void getHouseInfo(); void signContract(); void payFees();}
总结:
代理模式的组成:
Abstract Subject:抽象主题-声明真实主题和代理主题共同的接口
Real Subject:真实主题-真实的对象,需要被代理主题引用
Proxy Subject:代理主题(实现InvocationHandler)-可以在调用方法的前面和后面做一些事情(hook),
因为ProxySubject引用了RealSubject,并且实现了跟RealSubject一样的接口,所以ProxySubject可以操作RealSubject,还可以提供一些附加操作,例如before & after
代理的好处:可以抽取共同的部分,减少代码量!
代理作为调用着和真实对象的中间层,降低了模块间和系统的耦合性
用一个实现类
如果2个类的话,需要实现不同的功能的话。可以用2个不同的实现类
安卓用的代码模式
http://blog.csdn.net/bjp000111/article/details/56015662
http://blog.csdn.net/caowenbin/article/details/6036726
实战地方:
插件化原理里面的hook之动态代理------binder机制
volley
阅读全文
0 0
- Android 最常用的设计模式十一 安卓源码分析—— 代理模式(proxy)
- Android 最常用的设计模式五 安卓源码分析——建造者模式
- Android 最常用的设计模式十 安卓源码分析——策略模式(Strategy)
- Android 最常用的设计模式三 安卓源码分析—Observer观察者模式
- Android 最常用的设计模式八 安卓源码分析—工厂方法模式factory
- Android 最常用的设计模式一 安卓源码分析—单例模式singleInstance
- Android 最常用的设计模式二 安卓源码分析——组合模式(component)
- Android 最常用的设计模式九 安卓源码分析—— 适配器模式(Adapter)
- Android 最常用的设计模式四 安卓源码分析——模板方法(Mould)
- 设计模式(十一)proxy代理模式
- NET常用设计模式——代理(Proxy)模式
- Android与设计模式——代理(Proxy)模式
- 设计模式——代理模式(Proxy)
- 【设计模式】—— 代理模式Proxy
- 《GOF设计模式》—代理(PROXY)—Delphi源码示例:远程代理(Remote Proxy)
- 《GOF设计模式》—代理(PROXY)—Delphi源码示例:保护代理(Protection Proxy)
- Java 常用设计模式-代理模式Proxy
- 设计模式(十一)之Proxy - 代理模式
- mySQL之数据备份,迁移等操作
- 在页面的js直接调用后台传到页面的数据
- CCF——数列分段 && 日期计算
- interview20170914
- 程序员和算法
- Android 最常用的设计模式十一 安卓源码分析—— 代理模式(proxy)
- 从零开始搭网站---静态网页
- springmvc+jsp/html 前后台交互(二):controller和jsp页面交互
- java概述
- Mybatis源码中Mapper的动态代理实现原理
- 利用正则表达式去除字符串中的特殊字符
- Mac Finder 显示路径
- 免费直链网盘 OpenDrive
- can't not load JDBC driver class "com.mysql.jdbc.Driver"