代理模式

什么是代理模式?什么情况下使用代理模式?

代理模式是一种应用非常广泛的设计模式,当客户端代码需要调用某个对象的时候,客户端实际上并不关心是否准确得到该对象,它实际上只需要一个提供对应工能的对象,这时候我们就可以返回该对象的代理(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;}
}
View Code

 

错误的做法:

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;}
}
View Code

 

代理模式:为其他对象提供一个代理以控制对这个对象的访问

代理模式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、安全代理

 

posted @ 2016-04-13 12:07  guodaxia  阅读(193)  评论(0编辑  收藏  举报