设计模式之代理模式

c#代理模式

1、定义

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

2、原理

  1. UML类图
    这里写图片描述
    Subject类,定义了RealSubject和Proxy的公共接口,这样就在任何使用RealSubject的地方都可以使用Proxy

  2. 代码实现

 //Subject类,定义了RealSubject和Proxy的公共接口,这样就在任何使用RealSubject的地方都可以使用Proxy
  abstract  class Subject
    {
        public abstract void Request();
    }

    //定义Proxy所代表的真实实体
    class RealSubject : Subject
    {
        public override void Request()
        {
            Console.WriteLine("真实的请求");
        }
    }

    //保存一个引用,使得代理可以访问实体,并提供一个与Subject相同的接口,使得代理可以代替实体
    class Proxy : Subject
    {
        RealSubject realsubject;
        public override void Request()
        {
            if (realsubject==null)
            {
                realsubject = new RealSubject();
            }
            realsubject.Request();
        }
    }

客户端:

 class Program
    {
        static void Main(string[] args)
        {
            Proxy px = new Proxy();
            px.Request();
            Console.ReadKey();
        }
    }

输出:“真实的请求”。

3、实例

以代理别人送礼物为例:
1. UML类图
这里写图片描述
2.代码实现

  //定义送礼物的接口,让代理和追求着都实现
    interface GiveGift
    {
        void SendFlower();
        void SendDolls();
        void SendChocolate();
    }
  //追求者
    class Persuit : GiveGift
    {
        SchoolGirl schoolgirl;
        public Persuit(SchoolGirl girl)
        {
            this.schoolgirl = girl;
        }
        public void SendChocolate()
        {
            Console.WriteLine(schoolgirl.Name+":送你巧克力");
        }

        public void SendDolls()
        {
            Console.WriteLine(schoolgirl.Name + ":送你娃娃");
        }

        public void SendFlower()
        {
            Console.WriteLine(schoolgirl.Name + ":送你花");
        }
  //代理,负责送礼物
    class Proxy : GiveGift
    {
        Persuit persuit;
        public Proxy(Persuit per)
        {
            this.persuit = per;
        }
        public void SendChocolate()
        {
            persuit.SendChocolate();
        }

        public void SendDolls()
        {
            persuit.SendDolls();
        }

        public void SendFlower()
        {
            persuit.SendFlower();
        }
    }
 //女孩
    class SchoolGirl
    {
        private string name;


        public string Name
        {
            get { return name; }
            set { name = value; }
        }

    }

客户端:

 class Program
    {
        static void Main(string[] args)
        {
            SchoolGirl girl = new SchoolGirl();
            girl.Name = "LSP";
            Persuit DZB = new Persuit(girl);//追求者认识女生
            Proxy DZ = new Proxy(DZB);//代理认识追求者
            DZ.SendChocolate();
            DZ.SendDolls();
            DZ.SendFlower();
            Console.ReadKey();
        }
    }

输出:“LSP:送你巧克力,LSP:送你娃娃,LSP:送你花”

4、应用

  1. 远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同的地址空间的事实
  2. 虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象
  3. 安全代理,用来控制真实对象访问的权限。一般用于对象应该有不同的访问权限的时候
  4. 智能指引,是指当调用真实的对象时,代理处理另外一些事。如计算真实对象的引用次数,这样当该对象没有引用时可以自动释放它,或当第一次引用一个持久对象时,将他装入内存;或在访问一个实际对象前,检查是否一斤锁定它,以确保其他对象不能改变它。
    他们都是通过代理在访问一个对象时附加一些内务处理

5、源代码

设计模式之代理模式

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值