微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

设计模式之代理模式

以男生追MM为例子

男A 要求 男B 帮他  追求女C

未使用代理的案例

追求者A:

 class  Pursuit{

        Schoolgirl mm;

        public Pursuit(Schoolgirl mm){

             this.mm=mm;

    public void GiveDolls( ){

      Console.WriteLine(mm.Name+"送你洋娃娃");

}

    public void GiveFollwers(){

Console.WriteLine(mm.Name+"送你鲜花");

}

public void GiveChocolate(){

Console,WriteLine(mm.Name+"送你巧克力");

 

}

}

 

被追求者C

class Schoolgirl(){

 

public string Name{set;get;}

 

}

 

客户端代码

static void main(string[] args){

   Schoolgirl jiaojiao =new Schoolgirl();

  jiaojiao.Name="C";

Pursuit A =new Pursuit(jiaojiao);----------------------------------->A 直接向C 送花,送巧克力,并没有要B帮忙

A.GiveDolls();

A.GiveFolwers();

A.GiveChocolate();

A.Console.Read();

 

}

 

在之前的代码做改进

追求者

class  Proxy{

        Schoolgirl mm;

        public Pursuit(Schoolgirl mm){

             this.mm=mm;

    public void GiveDolls( ){

      Console.WriteLine(mm.Name+"送你洋娃娃");

}

    public void GiveFollwers(){

Console.WriteLine(mm.Name+"送你鲜花");

}

public void GiveChocolate(){

Console,WriteLine(mm.Name+"送你巧克力");

 

}

}

 

被追求者:

class Schoolgirl(){

 

public string Name{set;get;}

 

}

 

客户端代码

static void main(string[] args){

   Schoolgirl jiaojiao =new Schoolgirl();

  jiaojiao.Name="C";

Proxy A =new Proxy(jiaojiao);----------------------------------->是代理B主动向C献花,送巧克力,并没有体现A的存在

A.GiveDolls();

A.GiveFolwers();

A.GiveChocolate();

A.Console.Read();

 

}

 

再做改进:

代理接口:

interface IGiveGift( ){

void GiveDolls( );

void GiveFlowers( );

void GiveChocolate( );

}

追求者类 A

 

Class Pursuit : IGiveGift{

Schoolgirl mm;

Pubilc Pursuit(Schoolgirl mm){

this.mm=mm;

}

public void GiveDolls( ){

      Console.WriteLine(mm.Name+"送你洋娃娃");

}

    public void GiveFollwers(){

Console.WriteLine(mm.Name+"送你鲜花");

}

public void GiveChocolate(){

Console,WriteLine(mm.Name+"送你巧克力");

 

}

 

}

 

被追求者 C:

 

class Schoolgirl(){

 

public string Name{set;get;}

 

}

代理类  B:

class Proxy : IGivegift{

Pursuit  A;

public Proxy (Schoolgirl mm){

A =new Pursuit(mm);

 

public void GiveDolls(){

A.GiveDolls();

}

public void GiveFlowers(){

A.GiveFlowers();

}

}public void GiveChocolate(){

A.GiveChocolate();

}

}

 

客户端代码

static void main(string[] args){

Schoolgirl C=new Schoolgirl();

C.Name="C";

Proxy B=new Proxy(C);-------------------------->B 中产生了A的对象,就是  B替A给C 送鲜花,巧克力

B.GiveDolls();

B.GiveFlowers();

B.GiveChocolate();

Console.Read();

}

 

代理模式:为其他对象提供一种代理 以控制对这个对象的访问,隐藏了真正要访问的类。

 

案例分析:

abstract   class Subject{

public  abstract void Request();

}

 

 class RealSubject  :Subject {

        public override Request(){

          Console.Write("真实的请求");

               }

     }

 

 

 class Proxy :Subject {

     RealSubject realSubject ;

    public override void Request()

  {

         if(realSubject ==null){

      realSubject =new RealSubject();

}

   realSubject.Request();

 

}

static void main(string[] args){

Proxy proxy=new Proxy();

proxy.Request();

Console.Read();

}

 

应用场合:

1 远程代理  为一个对象在不同的地址空间 提供局部代表 可以隐藏一个对象在于 不同地址空间的事实 

 WebService  在应用程序中添加WEB引用,引用一个WebService,会在项目中生成一个WEBREFERENCE的文件夹和一些文件,这些就是代理,使得客户端调用代理就可以解决远程访问的问题

2 虚拟代理  是根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象,例如访问网页时,当网页中内容很多时,用户可以浏览到文章,然而图片却一直在加载,是因为那些图片是通过代理来代替真实的图片

3 安全代理 控制对真实对象的访问

4智能指引 当调用一些真实的对象,代理去处理一些事情

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐