1. 代理模式
代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
例如:
1、甲看上了已,但甲害羞,不敢直接找已说,然后就找已的闺蜜丙来替自己去跟已说!
这时丙充当代理也就出场了
2、A想租房子,但资源有限,在这小村庄了,找不到合适的,通过朋友介绍等方式。这时朋友就充当中介作用
代理模式一般涉及到三个角色:
抽象角色:声明真实对象和代理对象的共同接口;
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
1.抽象对象
package com.commond;
public abstract class Subject {
public abstract void Request();
}
2.真实对象
package com.commond;
import android.util.Log;
public class RealSubject extends Subject{
String tag = "RealSubject";
@Override
public void Request() {
Log.i(tag, "From RealSubject");
}
}
3.代理对象
package com.commond;
import android.util.Log;
public class ProxySubject extends Subject {
String tag ="ProxySubject";
private RealSubject realSubject;
@Override
public void Request() {
preRequest();
if(null == realSubject){
realSubject = new RealSubject();
}
realSubject.Request();
postRequest();
}
private void preRequest(){
Log.i(tag, "load begin");
}
private void postRequest(){
Log.i(tag, "load end");
}
}
调用:
Subject subject = new ProxySubject();
subject.Request();
客户端实际需要调用的是RealSubject类的request()方法,现在用ProxySubject来代理 RealSubject类,同样达到目的,同时还封装了其他方法(preRequest(),postRequest()),可以处理一些其他问题。
运行结果:
参考:《Java与模式》
来源http://hongshengpeng.com/article/show/206.aspx