Proxy代理模式是一种结构型设计模式,主要解决的问题是:在直接访问对象时带来的问题,其目的就是为其他对象提供一个代理以控制对某个对象的访问。
为了保持行为的一致性,代理类和委托类通常会实现相同的接口,所以在访问者看来两者没有丝毫的区别。从而在设计上获得了更大的灵活性 如此便于在目标实现的基础上增加额外的功能操作,前拦截,后拦截等,以满足自身的业务需求,同时代理模式便于扩展目标对象功能的特点也为多人所用。
下面我们还是用通俗易懂的方式理解代理模式
什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被代理的人能干活呀。
比如西门庆想happy一下,于是恰好碰上潘,可以怕引人耳目,找潘金莲,那潘金莲不好意思答复呀,咋办,找那个王婆做代理(还有假如你想开一场刘德华的演唱会,你直接去找华仔,华仔不一定见你(很忙的),所以你找华仔的经纪人,就能协调时间。)
表现在程序上是这样的,先定义一种类型的女人:
/**
* "嗨"类型的女人
*/
public interface HighWomen {
/**
* 此类型的人都能"嗨"
* */
public void high();
}
一种类型嘛,那肯定是接口,然后定义潘金莲
/**
* 潘金莲(被代理对象)
*/
public class Panjinlian implements HighWomen{
@Override
public void high() {
System.out.println("pan jin lian 正在嗨");
}
}
代理对象和被代理对象实现相同的接口
/**
* 王婆(代理对象)
*/
public class WangPo implements HighWomen{
private HighWomen highWomen;
public WangPo(){
//默认代理了潘
this.highWomen = new Panjinlian();
}
public WangPo(HighWomen highWomen){
//还可以代理别的嗨的女人
this.highWomen = highWomen;
}
@Override
public void high() {
highWomen.high();
}
}
两个女主角都上场了,男主角也该出现了
/**
* 西门官人才是真正需要"嗨"的人
*/
public class XiMenQ {
public static void main(String[] args) {
//西门官人需要“嗨”,就找王婆
WangPo wangPo = new WangPo();
//看似调用王婆的嗨,实际上幕后是调用潘在嗨
wangPo.high();
}
}
表面看起来西门庆是联系王婆,实际幕后是王婆作为潘金莲的代理人,活生生的一个例子,通过代理人实现了某种目的,如果真去掉王婆这个中间环节,直接是西门庆和潘金莲勾搭,估计很难成就武松杀嫂。
某一天西门庆觉得玩腻了,就找王婆问还有别的吗?然后王婆灵机一动,卢俊义的老婆贾氏同样的类型。出场
public class JiaShi implements HighWomen{
@Override
public void high() {
System.out.println("卢俊义的老婆贾氏在嗨。。。");
}
}
西门庆再次出场:
public class XiMenQ {
public static void main(String[] args) {
//西门官人需要“嗨”,就找王婆
WangPo wangPo = new WangPo();
//看似调用王婆的嗨,实际上幕后是调用潘在嗨
wangPo.high();
//如果有一天,西门官人玩腻了潘,想换一个人,让王婆联络别的"嗨"的女人
//王婆幕后找了贾氏
wangPo = new WangPo(new JiaShi());
wangPo.high();
}
}
说完这个故事,那额总结一下,代理模式主要使用了Java的多态,干活的是被代理类,代理类主要是接活,你让我干活,好,我交给幕后的类去干,你满意就成,那怎么知道被代理类能不能干呢?同根就成,大家知根知底,你能做啥,我能做啥都清楚的很,同一个接口。思考下现实有没有这样的场景,就可以使用代理模式。
其实这是所谓的静态代理,动态代理后面会写。