1. 代理模式
代理模式的作用:在某些情况下,我们无法和目标直接进行接触,这时候就得依靠中介来进行达到接触的目的。代理模式能屏蔽真实行为的访问,让程序更加安全。为其他对象提供一种代理以控制这个对象的访问。
代理模式的实现:
<1>代理类和被代理类(真实对象)要实现同一个接口。
<2>在代理类中持有一个被代理对象。
<3>在代理类中调用被代理类的真实行为。
代理模式和装饰模式有点类似。但是装饰模式主要是对被装饰对象(真实对象)进行功能增强,而代理模式主要是对被代理对象(真实对象)进行控制。
2. 代理模式的案例
西门庆要找潘金莲,但是潘金莲不好意思答复啊,这时候怎么办,找王婆做代理。
潘金莲(被代理对象)和王婆(代理对象)实现的共同接口:
//定义一种风流的女人的类型,潘金莲和王婆都属于这类人。
public interface KindWoman {
//这类女人能干吗呢?
public void throwEye();//抛媚眼
public void happyWithMan();//和男人那个。。。。
}
被代理对象(潘金莲):
//潘金莲---被代理(实现了风流的女人类型)
public class Pjl implements KindWoman{
public void throwEye(){
System.out.println("潘金莲抛媚眼");
}
public void happyWithMan(){
System.out.println("潘金莲和男人搞事情。。。");
}
}
代理对象(丑陋的王婆):
//王婆---------代理
public class Wp implements KindWoman{
private KindWoman woman;
public Wp(){
//默认是潘金莲的代理。
this.woman = new Pjl();
}
//王婆能给属于这个接口类型的人做代理,只要你是这类人
public Wp(KindWoman woman){
this.woman=woman;
}
public void throwEye() {
//在这里做操作,可以控制是否调用真实行为。
woman.throwEye();
//在这个位置。可以在真实行为完成后,再做操作。
}
public void happyWithMan() {
//自己老了,干不了,叫年轻的代替。
woman.doSomething();
}
}
男一号西门庆登场:
public class Xmq {
public static void main(String[] args) {
//主角潘金莲出场
KindWoman woman = new Pjl();
//把王婆叫出来。
Wp wp = new Wp(woman);
//西门庆说想和潘金莲搞事情,然后王婆就去帮西门庆安排。
wp.happyWithMan();
wp.throwEye();
}
}
3. 总结
代理模式主要使用了java的多态,干活的是被代理类,代理类主要是接活,你让我干活,好,我交给幕后的类去干,你满意就成,那怎么知道被代理类能不能干呢?同根就成,大家知根知底,你能做啥,我能做啥都清楚得很,同样一个接口呗。
3. 身边小常识
你可能觉得代理模式离我们很远,其实我们身边很多地方都用到了代理。比如你打开一个页面,页面里面有文字、图片等等信息。而我们打开页面的时候肯定是先看到文字,图片用一张破图等代替,最后破图才变成原来的图片。这便是一种代理模式,破图存储了原来图片的尺寸大小,不过是得等它下载下来。先用破图来代替,免得浏览器一直在等着下载图片,影响性能。