代理模式

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

代理模式的应用:

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

虚拟代理,根据需要创建开销很大的对象,通过代理来存放实例化需要很长时间的真实对象。

安全代理,用来控制真实对象的访问权限。

智能代理,当调用代理时,可以代理处理一些额外的功能。

案例场景:

向一位自己心仪的女孩表达爱意,一般我们有两种选择:亲自出马(有自信的人)和 使用‘媒婆’(比较害羞)。

其中使用‘媒婆’就是代理行为,我们实现如下:

 调用代理模式的主函数:

 

    class Program
    {
        static void Main(string[] args)
        {
            SchoolGirl jiaojiao = new SchoolGirl();
            jiaojiao.Name = "李娇娇";

            //亲自出马
            IGiveGift self = new Pursuit(jiaojiao);
            self.GiveChocolate();//送巧克力
            self.GiveDolls();//送洋娃娃
            self.GiveFlowers();//送鲜花

            //使用‘媒婆’
            IGiveGift daili = new Proxy(jiaojiao);
            daili.GiveChocolate();//送巧克力
            daili.GiveDolls();//送洋娃娃
            daili.GiveFlowers();//送鲜花

            Console.ReadKey();
        }
    }

 

SchoolGirl类是代表女孩对象,实现如下: 

 

    public class SchoolGirl
    {
        private string name;
        public string Name
        {
            get;
            set;
        }
    }

 

 

 

Pursuit类是代表一个真实的事物(追求女孩的追求者),实现如下:

 

    public 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 + "送你巧克力");
        }
    }

 

 

Proxy类是Pursuit类的代表,实现如下:

 

    public class Proxy : IGiveGift
    {
        Pursuit gg;
        public Proxy(SchoolGirl mm)
        {
            this.gg = new Pursuit(mm);
        }
        public void GiveDolls()
        {
            gg.GiveDolls();
        }
        public void GiveFlowers()
        {
            gg.GiveFlowers();
        }
        public void GiveChocolate()
        {
            gg.GiveChocolate();
        }
    }

 

Pursuit类和Proxy类都继承IGiveGift接口,实现如下:

 

 

 
    interface IGiveGift
    {
        void GiveDolls();
        void GiveFlowers();
        void GiveChocolate();
    }

 

我们看一张代理模式的结构图:

 

 

 

 

 

 

 

 

posted @ 2012-07-20 08:49  八神吻你  阅读(642)  评论(0编辑  收藏  举报