首页 > 其他 > 详细

代理模式

时间:2019-06-24 21:35:16      阅读:84      评论:0      收藏:0      [点我收藏+]

1.引入

  很多情况下,我们无法直接使用某个对象,需要经过一个“中间人”达到目的,该过程即使用了称为代理模式。例如,外网访问需要代理服务器,外国产品需要代购、中介、第三方售票等。使用代理模式能够间接访问到目标对象,具有职责清晰、高扩展性和保护目标对象等优势。

2. 代理模式的定义

  为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

3. 场景模拟

  场景引入: 戴笠帮贾卓义给娇娇送花、送巧克力、送礼物,最终娇娇和戴笠在一起。

 3.1 没有代理的实现

 技术分享图片

  代码实现:

 class SchoolGirl
    {
        private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
    }
class pursuite
    {
        SchoolGirl mm;
        public pursuite(SchoolGirl mm)
        {
            this.mm = mm;
        }
        public void GiveDolls()
        {
            Console.WriteLine(mm.Name+"give you dolls");
        }
        public void GiveFlowers()
        {
            Console.WriteLine(mm.Name + "give you flower");
        }
        public void GiveChocolate()
        {
            Console.WriteLine(mm.Name + "give you chocolate");
        }
    }
 class Program
    {
        static void Main(string[] args)
        {
            SchoolGirl mm = new SchoolGirl();
            mm.Name = "娇娇";
            pursuite ps = new pursuite(mm);
            ps.GiveChocolate();
            ps.GiveDolls();
            ps.GiveFlowers();
            Console.WriteLine("Hello World!");
        }
    }

3.2   只有代理的实现

  只有代理的实现中,类结构图如下图所示:

 技术分享图片代码实现:

    class SchoolGirl
    {
        private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
    }
    class Proxy
    {
        SchoolGirl mm;
        public Proxy(SchoolGirl mm)
        {
            this.mm = mm;
        }
        public void GiveDolls()
        {
            Console.WriteLine(mm.Name + "give you dolls");
        }
        public void GiveFlowers()
        {
            Console.WriteLine(mm.Name + "give you flower");
        }
        public void GiveChocolate()
        {
            Console.WriteLine(mm.Name + "give you chocolate");
        }
    }
    static void Main(string[] args)
        {
            SchoolGirl mm = new SchoolGirl();
            mm.Name = "jiaojiao";
            Proxy px = new Proxy(mm);
            px.GiveChocolate();
            px.GiveDolls();
            px.GiveFlowers();
            Console.WriteLine("Hello World!");
        }

3.3 代理模式实现

技术分享图片

 

interface GiveGift
    {
        void GiveDolls();
        void GiveFolwers();
        void GiveChocolate();
    }
 class pursuite:GiveGift
    {
        SchoolGirl mm;
        public pursuite(SchoolGirl mm)
        {
            this.mm = mm;
        }
        public void GiveDolls()
        {
            Console.WriteLine(mm.Name+"give you dolls");
        }
        public void GiveFolwers()
        {
            Console.WriteLine(mm.Name + "give you flower");
        }
        public void GiveChocolate()
        {
            Console.WriteLine(mm.Name + "give you chocolate");
        }
    }
class Proxy:GiveGift
    {
        pursuite jzy;//要代理的对象
        public Proxy(SchoolGirl mm)//通过构造函数要代理对象的控制
        {
            jzy = new pursuite(mm);
        }
        public void GiveDolls()
        {
            jzy.GiveDolls();
        }
        public void GiveFolwers()
        {
            jzy.GiveFolwers();
        }
        public void GiveChocolate()
        {
            jzy.GiveChocolate();
        }
    }
static void Main(string[] args)
        {
            SchoolGirl mm = new SchoolGirl();
            mm.Name = "jiaojiao";
            //pursuite ps = new pursuite(mm);
            Proxy dl = new Proxy(mm);
            dl.GiveDolls();
            dl.GiveFolwers();
            dl.GiveChocolate();
            Console.WriteLine("Hello World!");
        }

 4. 代理模式的定义

   代理模式: 为其他对象提供一种代理以控制对这个对象的访问。技术分享图片

 上述UML图中,

Subject类,都不敢图克RealSubject和Proxy的共用接口,使得在任何使用RealSubject的地方都可以使用Proxy.

abstract class Subject
    {
        public abstract void Request();
    }
    class RealSubject : Subject
    {
        public override void Request()
        {
            Console.WriteLine("真实的请求");
        }
    }
    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();
        }

 

 

 

 

优秀博客:

https://my.oschina.net/zhangxufeng/blog/1633187

https://cloud.tencent.com/developer/article/1198536

https://www.jianshu.com/p/a8aa6851e09e

 

代理模式

原文:https://www.cnblogs.com/mo-lu/p/10274596.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!