设计模式-装饰模式

Posted

tags:

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

技术分享

 

   

一个例子,假设说你有一个一个的列车车厢,每一个车厢都有对运输功能作一些不同的增强,然后你选取一些这样的车厢,连接起来,形成一个专列,这个专列的功能就是组成它的那些车厢的功能的叠加。这些都是生活中比较典型的装饰模式

 

层层包装,增强功能。这就是装饰模式的要旨

对扩展开放,对修改关闭

 

动态的给一个对象添加额外的职责(不重要的职责)

想要扩展功能,装饰者提供有别于继承的另一种选择

 

实质:

把要添加的附加功能分别放在单独的类中,并让

这个类包含它要装饰的对象,当需要执行时,客户端就可以有选择地、按顺序地使用装饰功

能包装对象。

 

装饰者和被装饰者对象有相同的超类

 

#include <iostream>
#include <string>
using namespace std;
//
class Person{
private:
  string m_strName;
public:
  Person(){}
  Person(string strName){
    m_strName = strName;
  }
  virtual void show(){
    cout <<"name is :"<<m_strName<<endl;
  }
};
//装饰类
class Finery : public Person
{
protected:
  Person* m_componment;
public:
  void Decroate(Person* compenment){
    this->m_componment = compenment;
//    m_componment = compenment;
  }
  virtual void show(){
    m_componment->show();
  }
};
//T恤
class Tshirt : public Finery{
public:
  virtual void show(){
    cout <<"T shirt"<<endl;
    m_componment->show();
  }
};
//裤子
class Trouser : public Finery{
public :
  virtual void show(){
    cout << "Trouser"<<endl;
    m_componment->show();
  }
};
int main(int argc, char *argv[])
{
  Person *p = new Person ("Sam");
  Trouser *t = new Trouser();
  Tshirt *ts = new Tshirt();
  t->Decroate(p);
  ts->Decroate(t);
  ts->show();//显示是分别向上一层一层调用前面所有类的,这样以达到目的
  return 0;
}

 

技术分享

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

设计模式---装饰者模式

设计模式之单例模式

Java设计模式之装饰者模式

装饰模式与代理模式的区别

设计模式之装饰器模式

设计模式-装饰者模式(Go语言描述)