android 代理模式( 二 )


[java] view plain copy
house = new House(" Abbey", 5000);
= new (house);
Log.i(TAG, " for ahouse");
.();
Log.i(TAG, "");
.();
.();
Log.i(TAG, "so easy");

android 代理模式

文章插图
整个代理模式的流程可以从下面的时序图展示出来.只跟代理进行交互.
android 代理模式

文章插图
2.虚拟代理
虚拟代理前面有介绍,就是基于代理模式又做了延迟加载来节省内存,但是如果某个对象要在多个没有固定时序地方使用的时候就要进行判空,也会一定程度上牺牲性能(有点像代理模式+懒汉模式).这里还是拿租房的例子来展示.
这里就假设House是一个很庞大的对象,在创建的时候很耗费资源,那我们就更改成当需要用它的时候才去初始化.这里就在构造的时候先判House的引用是否为空,然后才会初始化House,当然如果这里有多线程并发的话可以根据不同的场景进行加锁或者双检锁来保证线程安全.
[java] view plain copy
(){
if (null == house)
house = new House(" Abbey", 5000);
[java] view plain copy
= new ();
Log.i(TAG, " for ahouse");
.();
Log.i(TAG, "");
.();
.();
Log.i(TAG, "so easy");
3.强制代理
强制代理是反其道而行之的代理模式,一般情况下代理模式都是通过代理来找到真实的对象,而强制代理则是通过真实对象才能找到代理也就是说由真实对象指定代理,当然最终访问还是通过代理模式访问的.从名字还能看出它跟其他代理的一个不同,就是强制用代理.拿上面普通代理的例子来说,看不到实体的House的时候它只能通过代理来访问,但是由于没有限制,也可以直接绕过来访问House,但是强制代理就多了一个限制,必须通过才能访问House.就像一些房东嫌麻烦,有房客直接电话过来说要看房,房东给出一个中介的电话说你跟中介联系吧.
首先需要在接口里面添加一个获取代理的接口
[java] view plain copy
{
void ();
void ();
void ();
();
真实对象实现接口,并在中实例化代理,同时在其他方法里面做代理判断,只有使用自身自定的代理才会正常进行.
[java] view plain copy
class House{
finalTAG = House.class.();
name;
price;
proxy;
House( name,price){
this.name = name;
this.price = price;
@
void () {
if (())
Log.i(TAG, "House Info- name:" + name + " ¥:" + price);
else
Log.i(TAG, " useproxy");
@
void () {
if (())
Log.i(TAG, ":" + name + "at" +
new ("HH:mm:ss").(.()));
else
Log.i(TAG, " useproxy");
@
android 代理模式

文章插图
void () {
if (())
Log.i(TAG, "Bill: name-" + name + " $-" + price);
else
Log.i(TAG, " useproxy");
@
() {
if (null == proxy)
proxy = new (this);
proxy;
(){
if (null == proxy)
false;
else
true;
如果这个时候直接操作House对象,或者通过构建的代理来访问都会返回以下结果
android 代理模式

文章插图
所以我们必须使用由真实对象指定的代理才可以正常得访问.
[java] view plain copy
house = new House(" Abbey", 5000);
house = house.();
Log.i(TAG, " for ahouse");
house.();
Log.i(TAG, "");
house.();
house.();
但是这里的强制代理有个Bug,强制代理其实并没有生效,还是可以直接访问House,例如我通过下面的方式来进行访问,只是通过创建并获取代理,但是我不用代理还是直接用House的实例进行访问,这个时候还是可以正常访问的.后续会想办法解了这个Bug并且更新上来的.