为别人做嫁衣---代理模式

引例 :追求者(C),被追求者(B),代理者(A)  故事概要: A和B是好朋友, A喜欢B,但A以C的名义去送给B礼物 1.没有代理  追求者类 class Pursuit { SchoolGirl mm; public Pursuit(SchoolGirl mm) {
摘要由CSDN通过智能技术生成


引例  追求者(C),被追求者(B) ,代理者(A)  


故事概要 AB是好朋友, A喜欢B ,但AC的名义去送给B礼物

 

1.没有代理

 


 

追求者类
    class Pursuit
    {
        SchoolGirl mm;
        public Pursuit(SchoolGirl mm)
        {
            this.mm = mm;
        }
        public void GiveDolls()
        {
           Console.WriteLine(mm.Name+"迷你洋娃娃");
        }
        public void GiveFlowers()
        {
           Console.WriteLine(mm.Name+"迷你鲜花");
        }
        public void GiveChocolate()
        {
           Console.WriteLine(mm.Name+"迷你巧克力");
        }
    }
    //被追求者类
    class SchoolGirl
    {
        private string Name;
        public string Name
        {
            get { return Name; }
            set { Name = value; }
        }
    }

注:被追求者根本就不认识C 怎么办?

 

2.有代理


这样的情况下  代码中只体现了代理,真正的追求者又不见了  ,变成了礼物是代理买的了

 

 

那么如何能写出,追求者是存在的,同时代理也是存在的,  实现 礼物是追求者买的, 代理去送礼物呢?

 

 

引入   代理模式 

 

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

代理模式结构图  


 

代理模式应用模板:

//代理模式 格式 
    abstract classSubject  //subject类 定义了 代理和真实实体的接口
    {
        public abstract void Request();
    }
   //RealSubject  ,定义Proxy 所代表的真实实体
    class RealSubject : Subject
    {
        public override void Request()
        {
           Console.WriteLine("真实的请求");
        }
    }
    //Proxy 类,保存一个引用使得代理可以访问实体,并提供一个与Subject 的接口相同的接口,这样就能代替实体   
    class Proxy : Subject
    {
        RealSubject realSubject;
        public override void Request()
        {
            if (realSubject == null)
            {
                realSubject = newRealSubject(); 
            }
            realSubject.Request();
        }
    }
 


就开篇的故事来说 利用代理模式符合要求  如下所示

    

代理接口如下: 
    interface IGiveGift
    {
        void GiveDolls();
        void GiveFlowers();
        void GiveChoolate();
    }
    //追求者如下 
    class Pursuit :IGiveGift     //追求者继承接口,进而实现送礼物的一系列动作
    {
        SchoolGirl mm;
        public Pursuit(SchoolGirl mm)
        { this.mm = mm; }
        public void GiveDolls()
        {
           Console.WriteLine(mm.name +"迷你洋娃娃");
        }
        public void GiveFlowers()
        {
           Console.WriteLine(mm.name+"迷你鲜花");
        }
        public void GiveChocolate()
        {
           Console.WriteLine(mm.name +"迷你巧克力");
        }
    }
    //代理类如下  
    class Proxy : IGiveGift
    {
        Pursuit gg;
        public Proxy(SchoolGirl mm)
        {
            gg = new Pursuit(mm);
        }
        public void GiveDolls()
        {
            gg.GiveDolls();
        }
        public void GiveFlowers()
        {
            gg.GiveFlowers();
        }
        public void GiveChocolate()
        {
            gg.GiveChocolate();
        }
    }
    //被追求者 
    class SchoolGirl
    {
        //private string name;
        public string name
        {
            get { return name; }
            set { name = value; }
        }
    }

通过上述代码的描述 就能符合我们预想的要求了,即存在追求者 也存在 代理者   虽然被追求者不认识追求她的人,但是却通过代理得到了礼物,效果也达到了  

 

 

附录:

代理模式使用的场合: 


代理模式  应用场合    

  1. 远程代理  也就是为了一个对象在不同的地址空间提供局域代表。这样可以隐藏一个对象存在于不同地址空间的事实    
  2. 虚拟代理   是根据需要创建开销很大的对象,  通过它来存放实例化需要很长时间的真实对象
  3.   安全代理   用来控制真实对象访问时的权限 
  4. 智能指引  是指当调用真实的对象时,代理处理另外一些事  

 

个人理解    

     代理就是真实对象的代表,通过代理去办我们不能去办的事,我想这就像是生活中的老板和秘书吧,老板说 ,秘书去做,  不必老板全部出面去解决事情。  即方便 同时也提高了工作效率 ,就像设计模式中举得例子,图片 网页代理显示,但是我们需要的时候,还是要去真正的地方下载。在开发中应用代理模式会使职责更加清晰吧。就像我们常见的中介一样, 各取所需,目的都是一样的,通过代理来完成 扩展性也就更高了,如果我想找保姆,我自己的能力,范围有限,但是通过中介 我可以选择的人就多了,这就是利用代理模式的好处吧! 

 

                

 

                                                    ---------大话设计模式(代理模式)

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值