Android设计模式之代理模式 Proxy( 二 )


对于客户来说,完全不用跟House进行直接交互,这里先定义一个房子叫唐顿庄园,租金5k,建立一个房屋代理,把唐顿庄园委托给代理.客户要找房子,签合同,付租金直接找代理就行了.
【Android设计模式之代理模式 Proxy】IHouse house = new House("Downton Abbey", 5000);IHouse proxyHouse = new ProxyHouse(house);Log.i(TAG, "looking for a perfect house");proxyHouse.getHouseInfo();Log.i(TAG, "thinking");proxyHouse.signContract();proxyHouse.payFees();Log.i(TAG, "so easy");
整个代理模式的流程可以从下面的时序图展示出来.只跟代理进行交互.
2.虚拟代理
虚拟代理前面有介绍,就是基于代理模式又做了延迟加载来节省内存,但是如果某个对象要在多个没有固定时序地方使用的时候就要进行判空,也会一定程度上牺牲性能(有点像代理模式+懒汉模式).这里还是拿租房的例子来展示.
这里就假设House是一个很庞大的对象,在创建的时候很耗费资源,那我们就更改成当需要用它的时候才去初始化.这里就在构造的时候先判House的引用是否为空,然后才会初始化House,当然如果这里有多线程并发的话可以根据不同的场景进行加锁或者双检锁来保证线程安全.
public ProxyHouse(){if (null == house)house = new House("Downton Abbey", 5000);}
IHouse proxyHouse = new ProxyHouse();Log.i(TAG, "looking for a perfect house");proxyHouse.getHouseInfo();Log.i(TAG, "thinking");proxyHouse.signContract();proxyHouse.payFees();Log.i(TAG, "so easy");
3.强制代理
强制代理是反其道而行之的代理模式,一般情况下代理模式都是通过代理来找到真实的对象,而强制代理则是通过真实对象才能找到代理也就是说由真实对象指定代理,当然最终访问还是通过代理模式访问的.从名字还能看出它跟其他代理的一个不同,就是强制用代理.拿上面普通代理的例子来说,看不到实体的House的时候它只能通过代理来访问,但是由于没有限制,也可以直接绕过来访问House,但是强制代理就多了一个限制,必须通过才能访问House.就像一些房东嫌麻烦,有房客直接电话过来说要看房,房东给出一个中介的电话说你跟中介联系吧.

Android设计模式之代理模式 Proxy

文章插图
首先需要在接口里面添加一个获取代理的接口
public interface IHouse {void getHouseInfo();void signContract();void payFees();IHouse getProxy();}
真实对象实现接口,并在中实例化代理,同时在其他方法里面做代理判断,只有使用自身自定的代理才会正常进行.
public class House implements IHouse{private final String TAG = House.class.getSimpleName();private String name;private double price;private IHouse proxy;public House(String name, double price){this.name = name;this.price = price;}@Overridepublic void getHouseInfo() {if (isProxy())Log.i(TAG, "House Info- name:" + name + "¥:" + price);elseLog.i(TAG, "Please use correct proxy");}@Overridepublic void signContract() {if (isProxy())Log.i(TAG, "Contract:" + name + "signed at" +new SimpleDateFormat("HH:mm:ss").format(SystemClock.uptimeMillis()));elseLog.i(TAG, "Please use correct proxy");}@Overridepublic void payFees() {if (isProxy())Log.i(TAG, "Bill: name-" + name + "$-" + price);elseLog.i(TAG, "Please use correct proxy");}@Overridepublic IHouse getProxy() {if (null == proxy)proxy = new ProxyHouse(this);return proxy;}private boolean isProxy(){if (null == proxy)return false;elsereturn true;}}
如果这个时候直接操作House对象,或者通过构建的代理来访问都会返回以下结果