• C#-设计模式-代理模式


    有时候,我们的执行类不愿意被客户端看到,又或者我们需要对访问执行类的客户端的权限进行验证,如果权限不够的话就不允许访问,这种需求就是明显的要使用代理模式

    1.定义

    代理模式——就是给某一个对象提供一个代理,并由代理对象控制对原对象的引用。在一些情况下,一个客户不想或者不能直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

    例如电脑桌面的快捷方式就是一个代理对象,快捷方式是它所引用的程序的一个代理。

    UML图拷贝自 链接

    2.代码实现

    public interface ExecSqlInter
    {
        void ExecSql();
    }
    
    public class DbHelper : ExecSqlInter
    {
        public void ExecSql()
        {
            // 执行sql语句
        }
    }
    
    public class AdminProxy : ExecSqlInter
    {
        ExecSqlInter dbHelper = new DbHelper();
    
        string user = string.Empty;
    
        public AdminProxy(string user)
        {
            this.user = user;
        }
    
        public void ExecSql()
        {
            if (user == "admin")
            {
                dbHelper.ExecSql();
            }
        }
    }

    上面的代码判断用户是不是管理员,只有是管理员的时候才让执行ExecSql的方法。其实这就是,使用代理来限制客户端,使得只有满足一定条件下的用户,才能去访问被代理的对象。

    这就是代理模式最大的用处。

    3.特点

    优点:将客户端和被代理对象解耦,使得可以在代理类中对访问进行限制,如果限制的方式改变,只需要更换代理对象就可以了

    缺点:增加了系统的复杂度,因为在客户端和被代理对象之间添加了一个新的中介,因此访问的效率会降低(这也基本是所有的设计模式的缺点,用效率还换取后期的可扩展性)

    4.一些其他的讨论

    4.1 装饰模式和代理模式

    最开始我在学习代理模式和装饰模式的时候,一直觉得这两个模式好像,都是要继承抽象,要持有被装饰(代理)的对象实例;

    最后慢慢看的多了之后才发现两者的不同:

    1)装饰模式的功能主要是为装饰类提供新的功能,而代理模式主要还是为了显示客户端对被代理类的访问,两者的使用场景是有差异的。

    2)其次最重要的一点,

    在使用装饰模式的时候,被装饰对象是要在运行的时候才添加到装饰类中,也就是说,运行过程中是可以修改被装饰类的。这也是为什么装饰类的构造方法都要将被装饰对象传递过来;

    而代理模式,被代理的对象在运行前已经是确定的了,因此并不需要在构造方法中传递被代理类的实例。

    希望各位学习愉快~

  • 相关阅读:
    android学习计划2
    在ubuntu12.04下编译android4.1.2添加JNI层出现问题
    android原生系统裁剪
    LM393,LM741可以用作电压跟随器吗?
    android-86-Can't create handler inside thread that has not called Looper.prepare()
    三星 PMU NXE2000,x-powers的AXP228,NXE2000
    当函数没有return时错误
    Perl OOP
    ORA-01031: 权限不足
    Oracle 10g 10.2.0.1 在Oracle Linux 5.4 32Bit RAC安装手冊(一抹曦阳)
  • 原文地址:https://www.cnblogs.com/gamov/p/10514967.html
Copyright © 2020-2023  润新知