1。代理模式概述
为什么要有“代理”? 生活中就有很多例子,例如委托业务等等,代理就是被代理者没有能力或者不愿意去完成某件事情,需要找个人代替自己去完成这件事,这才是“代理”存在的原因,例如,我现在需要出国,但是我不愿意自己去办签证,预定机票和酒店(觉得麻烦 ,那么就可以找旅行社去帮我办,这时候旅行社就是代理,而我自己就是被代理了。
代理模式的定义:ProxyPattern(即:代理模式),23种常用的面向对象软件的设计模式之一为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
2。静态代理
以下我们借用公子和西门的例子来介绍一下静态代理
2.1不使用代理模式时
公子类的内部有一个快乐的方法,此时如果我们的西门类如果想要使用这个方法,正常情况下直接创建一个公子类调用快乐的方法即可
公共类公子{
公共空快乐(){
System.out.println(“金莲快乐…”);}
}
公共类西门站{
公共静态void main (String [] args) {
公子公子=new公子();
jinLian.happy ();}
}
2.2使用静态代理
如果我们使用静态代理模式的话,西门类如果想要调用快乐的方法,那么它便不会直接去找公子类,而是通过一个代理对象WangPo间接找到公子类。这样做的好处是,我们可以通过WangPo这个代理,在快乐的方法中添加一些想要的功能,例如:
公共类WangPo {
公子公子,
公共WangPo(公子公子){
。jinLian=jinLian;
}
public void happy(){
openHouse();
jinLian.happy();
clear();
}
public void clear(){
System.out.println("打扫战场...");
}
public void openHouse(){
System.out.println("以做衣服的名义把2人约到房间...");
}
}//WangPo
public class XiMen {
public static void main(String[] args) {
JinLian jinLian=new JinLian();
WangPo wangPo=new WangPo(jinLian);
wangPo.happy();
}
}//XiMen
public class JinLian {
public void happy() {
System.out.println("金莲happy...");
}
}//JinLian
这样,XiMen类想要调用happy方法,并且想要使用新增的功能时,只需要调用WangPo的happy方法即可。
2.3静态代理改进
现在,虽然实现了代理模式,但是目前的代理对象和委托对象都已经固定了,这样做局限性很大,我们的XiMen类如果想要调用其它委托者的Happy方法,就只能找其它的代理对象,此时我们对代码再次改进一下,新加一个FindHappy接口,委托者对象只需要实现FinHappy接口,便可以实现一个代理对象代理多个委托对象。如果,XiMen现在想要通过WangPo使用JinLian和YanPoXi的happy方法。我们可以做出如下改写
public interface FindHappy {//抽象角色
void happy();
}
public class JinLian implements FindHappy {//委托者1
@Override
public void happy() {
System.out.println("金莲happy...");
}
}//JinLian
public class YanPoXi implements FindHappy {//委托者2
@Override
public void happy() {
System.out.println("阎婆惜happy...");
}
}//YanPoXi
public class WangPo implements FindHappy {//代理者
FindHappy findHappy;
public WangPo(FindHappy findHappy) {
this.findHappy=findHappy;
}
公共空openHouse () {
System.out.println(“以做衣服的名义把2人约到房间…”);}
@Override
公共空间快乐(){
openHouse ();
//让委托者快乐()
findHappy.happy ();
明确();}
公共空间清晰(){
System.out.println(“打扫战场…”);}
}
公共类西门站{
公共静态void main (String [] args) {
公子公子=new公子();
YanPoXi YanPoXi=new YanPoXi ();
WangPo WangPo=new WangPo (YanPoXi);
WangPo wangPo1=new WangPo(公子);
wangPo.happy ();
wangPo1.happy ();}
}
如此一来我们便可以通过一个代理对象代理所有重写了快乐的方法的对象
这便是静态代理模式
3。动态代理
动态代理与静态代理的区别是,动态代理的代理对象是在使用者调用委托者的方法时才创建的,动态代理它可以直接给某一个目标(被代理 对象)对象(实现了某个或者某些接口)生成一个代理对象,也就是当西门类想要使用快乐的方法时,代理对象才会生成,并且不需要代理类存在