代理模式
什么是代理模式?什么情况下使用代理模式?
代理模式是一种应用非常广泛的设计模式,当客户端代码需要调用某个对象的时候,客户端实际上并不关心是否准确得到该对象,它实际上只需要一个提供对应工能的对象,这时候我们就可以返回该对象的代理(Proxy)。
这种设计方式下,系统会为某个对象提供一份代理对象,并由代理对象控制对源对象的引用。代理就是一个java对象代表另一个java对象采取行动。在某些情况下,客户端不想或者不能直接调用被调用着,代理对象可以在客户和目标中起到中介的作用、
总而言之,由于总总原因,客户端代码不能或不希望直接访问被调用对象,所以额外创建一个代理对象返回给客户端使用,这种设计方式就是代理模式。
例子:做嫁衣通过戴利送东西给李娇娇
demo:
package dailimoshi; public class Demo_two { public static void main(String[] args){ //应用代理模式 SchoolGirl2 jiaojiao=new SchoolGirl2(); jiaojiao.setName("李娇娇"); Proxy2 daili=new Proxy2(jiaojiao); daili.GiveDolls(); daili.GiveFlowers(); daili.GiveChocolate(); } } interface IGiveGift{ void GiveDolls(); void GiveFlowers(); void GiveChocolate(); } class Pursuit2 implements IGiveGift{ SchoolGirl2 mm; public Pursuit2(SchoolGirl2 mm){this.mm=mm;} public void GiveDolls(){System.out.println(mm.getName()+" 送你洋娃娃");} public void GiveFlowers(){System.out.println(mm.getName()+" 送你鲜花");} public void GiveChocolate(){System.out.println(mm.getName()+" 送你巧克力");} } class Proxy2 implements IGiveGift{//戴利 Pursuit2 gg; public Proxy2(SchoolGirl2 mm){this.gg=new Pursuit2(mm);} public void GiveDolls(){gg.GiveDolls();} public void GiveFlowers(){gg.GiveFlowers();} public void GiveChocolate(){gg.GiveChocolate();} } class SchoolGirl2{ private String name; public void setName(String name){this.name=name;} public String getName(){return name;} }
错误的做法:
package dailimoshi; public class Demo_one { public static void main(String[] args){ } public static void method_one(){//没有使用戴利,做嫁衣和娇娇不认识,不符合实际情况 SchoolGirl jiaojiao=new SchoolGirl(); jiaojiao.setName("jiaojiao"); Pursuit zuojiayi=new Pursuit(jiaojiao); zuojiayi.GiveDolls(); zuojiayi.GiveFlowers(); zuojiayi.GiveChocolate(); } public static void method_two(){//仅仅使用戴利,忽略了送方,不符合实际情况 SchoolGirl jiaojiao=new SchoolGirl(); jiaojiao.setName("jiaojiao"); Pursuit zuojiayi=new Pursuit(jiaojiao); zuojiayi.GiveDolls(); zuojiayi.GiveFlowers(); zuojiayi.GiveChocolate(); } } class Pursuit{ SchoolGirl mm; public Pursuit(SchoolGirl mm){this.mm=mm;} public void GiveDolls(){System.out.println(mm.getName()+"送你洋娃娃");} public void GiveFlowers(){System.out.println(mm.getName()+"送你鲜花");} public void GiveChocolate(){System.out.println(mm.getName()+"送你巧克力");} } class Proxy{//戴利 SchoolGirl mm; public Proxy(SchoolGirl mm){this.mm=mm;} public void GiveDolls(){System.out.println(mm.getName()+"送你洋娃娃");} public void GiveFlowers(){System.out.println(mm.getName()+"送你鲜花");} public void GiveChocolate(){System.out.println(mm.getName()+"送你巧克力");} } class SchoolGirl{ private String name; public void setName(String name){this.name=name;} public String getName(){return name;} }
代理模式:为其他对象提供一个代理以控制对这个对象的访问
代理模式Proxy结构图
Subject类RealSubject和Proxy的共用接口 abstract class Subject(){ public abstract void Request(); } RealSubject 定义Proxy所代理的真实实体 class RealSubject : Subject{ public void Request(){ System.out.println("real request1“;); } } Proxy 代理类 class Proxy : Subject{ RealSubject realSubject; public void Request(){ if(realSubject==null) realSubject=new RealSubject(); realSubject.Request(); } } 客户端代码: static void Main(String[]args){ Proxy proxy=new Proxy(); proxy.Request(); }
应用场合:
1、远程代理
2、虚拟代理
3、安全代理