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

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;
};

  

原文地址:https://www.cnblogs.com/perfy576/p/8550991.html