• 设计模式-代理模式(结构)、装饰模式(结构)


    0 代理模式和装饰模式

    代理模式和装饰模式,类似。都是继承或是关联原有类,然后通过新类通过转发请求的同时添加额外的操作达到扩展、限制原有类。

    1 代理模式

    1.0 需求

    当创建一个对象的代价很大, 而创建出的对象可能并不会被实际使用到。

    或是,针对不同的权限,对象的某些接口可能不能被调用。

    因此使用关联(组合)的方式使用一个类封装实际功能类:

    1. 当实际调用接口的时候,再去创建实际功能类的对象
    2. 当存在权限的时候,使用不同的类封装实际功能类的对象。
    3. 远程代理,将实际的功能转发给远程对象。

    1.1 实现

    /* 权限控制 */
    // 员工类
    class ABStaff 
    {
    public:
        // 拥有所有的权限,单都是虚函数
    };
    
    class Boss :public ABStaff
    {
        public:
        // 不变,boss拥有所有全向
    };
    
    class xiaobing:public ABStaff
    {
        public:
        // 重写某些小兵不应该具有的函数,达到权限控制
    };
    
    /* 延时创建 */
    class Pic 
    {
        // 创建开销很大的类
    };
    
    class Proxy 
    {
    public:
        Proxy(/*提供创建pic相关的信息*/);
        void do();
    private:
        //所有的函数都包含create_pic(),先判断是否有pic,如果没有就先创建。
        //当然也有函数可能不会用到,因此就不用调用该函数
        void create_pic(); 
        Pic *pic;
    }
    

      

    2 装饰模式

    2.0 需求

    已经有一个类了,但是需要再这个类的基础上扩展额外的功能,例如调用api前打个log。

    或是对传入参数先预处理一下。

    因此使用装饰这模式。

    这个模式很简单,就是继承实际功能类对象,然后按照该对象的接口,重建同名,然后转发。

    实现对类的功能拓展。

    用继承的原因在于,能够复用原来类的代码。

    2.1 实现

    class MoreYellowBook:public AbBook
    {
    public:
      MoreYellowBook(AbBook*b):_book(s);
      //功能增强
      MoreYello()
      {
        //这里可以放个函数
        this->_book->part01();
        //这里还可以放一个增强函数
      }
      //下面实现上面的虚函数。
      virtual string part01()
      {
        _book->part01();//不建议在这里改变功能。
      }
      //省略代码
    private:
      AbBook _book;
    };
    

      

  • 相关阅读:
    对百度搜索引擎的评论
    团队开发个人总结05
    Bootsrap下拉菜单实现Hover下拉效果
    C#抽奖优惠券生成唯一码方法
    js.live方法无效, 报错:uncaught TypeError: $(...).live is not a function
    SQL 插入一条自定义主键值的数据
    一款很简单的直接发送邮件功能
    SQL生成指定范围内随机值
    SQL(replace)替换字段中指定的字符
    SQL表中删除一列
  • 原文地址:https://www.cnblogs.com/perfy576/p/8550991.html
Copyright © 2020-2023  润新知