zoukankan      html  css  js  c++  java
  • 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)其次最重要的一点,

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

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

    希望各位学习愉快~

  • 相关阅读:
    一个简单例子:贫血模型or领域模型
    eclipse从数据库逆向生成Hibernate实体类
    Hibernate unsaved-value 属性
    webservice和restful的区别
    Web Service 的工作原理
    Hibernate3的DetachedCriteria支持
    hibernate criteria中Restrictions的用法
    Google Gson 使用简介
    struts2 访问国际化资源 <s:text>作为属性
    EL表达式从request和session中取值
  • 原文地址:https://www.cnblogs.com/gamov/p/10514967.html
Copyright © 2011-2022 走看看