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

Posted perfy576

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-代理模式(结构)装饰模式(结构)相关的知识,希望对你有一定的参考价值。

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

  

 

以上是关于设计模式-代理模式(结构)装饰模式(结构)的主要内容,如果未能解决你的问题,请参考以下文章

OOAD-设计模式结构型模式之适配器装饰器代理模式

设计模式-结构型模式讲解下(装饰者外观代理)

设计模式 结构型模式 -- 结构型模式(代理模式适配器模式装饰者模式桥接模式外观模式组合模式享元模式)

设计模式----结构型模式之代理模式和装饰者模式的区别

跟我学Java设计模式第三天:代理模式适配器装饰者等其中模式结构

设计模式之美学习-结构型-装饰者模式(二十)