设计模式之代理模式

以男生追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智能指引 当调用一些真实的对象,代理去处理一些事情

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值