zoukankan      html  css  js  c++  java
  • 4、代理模式

    代理模式:

    代理模式(Proxy Pattern),为其他对象提供一种代理以控制对这个对象的访问,这种类型的设计模式属于结构型模式。

    代理模式其实就是访问对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途(代理就是真实对象的代表。)

    应用实例: 1、Windows 里面的快捷方式。 2、猪八戒去找高翠兰结果是孙悟空变的,可以这样理解:把高翠兰的外貌抽象出来,高翠兰本人和孙悟空都实现了这个接口,猪八戒访问高翠兰的时候看不出来这个是孙悟空,所以说孙悟空是高翠兰代理类。 3、买火车票不一定在火车站买,也可以去代售点。 4、一张支票或银行存单是账户中资金的代理。支票在市场交易中用来代替现金,并提供对签发人账号上资金的控制。 5、spring aop。

    使用场景:按职责来划分,通常有以下使用场景: 1、远程代理。 2、虚拟代理。 3、Copy-on-Write 代理。 4、保护(Protect or Access)代理。 5、Cache代理。 6、防火墙(Firewall)代理。 7、同步化(Synchronization)代理。 8、智能引用(Smart Reference)代理。

    优点: 1、职责清晰。 2、高扩展性。 3、智能化。
    缺点:1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。 2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

    UML图如下:

    例(为别人做嫁衣——请代理送礼物):

    代码实现:

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace 代理模式
    {
        class SchoolGirl
        {
            private string name;
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
        }
        
         //送礼物
        interface GiveGift
        {
            void GiveDolls();
            void GiveFlowers();
            void GiveChocolate();
        }
    
        //真实对象
        class Pursuit : GiveGift
        {
            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 : GiveGift
        {
            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 Program
        {
            static void Main(string[] args)
            {
                SchoolGirl jiaojiao = new SchoolGirl();
                jiaojiao.Name = "李娇娇";
    
                Proxy daili = new Proxy(jiaojiao);
    
                daili.GiveDolls();
                daili.GiveFlowers();
                daili.GiveChocolate();
    
    
                Console.Read();
            }
        }
    }
    

    代理模式应用:

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

    2.虚拟代理:根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象,这样就可以达到性能的最优化。(例:当我们打开一个很大的HTML文件时,里面可能有很多文字和图片,但是你还是可以很快的打开它,此时你所看到的是所有的文字,但图片却是一张一张的下载后才能看到,那些未打开的图片框,就是通过虚拟代理来替代了真实的图片。)(浏览器就是采用代理模式来这样优化下载的)

    3.安全代理:用来控制真实对象访问时的权限。一般用于对象应该有不同的访问权限的时候。

    4.智能指引:是指当调用真实的对象时,代理处理另一些事。(例如计算真实对象的引用次数,这样对该对象没有引用时可以自动释放它;当第一次引用一个持久对象时,将它装入内存;或在访问一个实际对象前检查是否已经锁定它,以确保其他的对象不能改变它。他们都是通过代理在访问一个对象时附加一些内务处理。)

  • 相关阅读:
    ul做导航栏
    论布局,bfc,margin塌陷和合并,经典bug
    mon-hom
    新浪下拉菜单模仿
    JQ筛选方法,筛选父子元素
    JQuery筛选选择器
    JQuery隐式迭代
    python 和 C# DES加密
    交互设计[1]--设计心理学
    javascript学习(9)——[设计模式]单例
  • 原文地址:https://www.cnblogs.com/study-hard-forever/p/13160945.html
Copyright © 2011-2022 走看看