C++设计模式(一)装饰者

来源:互联网 发布:java做贪吃蛇游戏 编辑:程序博客网 时间:2024/04/30 15:38

 一、引入

  当我们想要扩展类的功能的时候,很多情况下会考虑用继承的方法,比如我们的以前的手机类,只支持打电话,发短信,如果我们想要扩展手机的功能,让普通的手机变成智能手机,那最简单的方式就是新建一个智能手机类并继承手机类,扩充智能手机拥有的新功能,比如打游戏,上网。

  但是子类继承的方法总归不是非常灵活啊,为了更好的解决类功能扩展的问题,我们来引用今天要学习的新模式——装饰模式。首先先看一下标准定义。

 装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活。

 

从这个定义中可以找到几个要点:

  1.动态的扩展

  2.不会改变原有类

  3.不用生成子类的继承方式

 

  在这个模式中主要有四个类

  1.原始类接口(接口类型或者抽象类)

  2.原始类的具体实现类

  3.装饰器接口(一般类或抽象类)

  4.继承了装饰器接口的一系列具体装饰器

UML类图

代码描述

1.原始类接口(接口类型或者抽象类)

class Phone
{

public:
 Phone();
 virtual~Phone();

 virtual void Call();
 virtual void SendMsg();  // 虚函数或者纯虚函数

};

2.原始类的具体实现类

class IPhone : public Phone
{

public:
 IPhone();
 virtual ~IPhone();

 virtual void Call();
 virtual void SendMsg();

};

3.装饰器接口(一般类或抽象类)

class PhoneDecorator : public Phone
{

public:
 PhoneDecorator(Phone* phone);
 virtual ~PhoneDecorator();
 Phone *m_Phone;

 virtual void Call();
 virtual void SendMsg();

private:
 m_pPhone * m_pPhone;

};

4.继承了装饰器接口的一系列的具体装饰器

class ConcreteDecorator :public PhoneDecorator
{

public:
 ConcreteDecorator(Phone *phone);
 virtual ~ConcreteDecorator();

 virtual void Call(); // 在函数里调用父类的Call,然后调ChangeVoice
 void ChangeVoice();  // 增加变声功能
 virtual void SendMsg();

};

 

5.测试

void main()

{

              Phone *iphone = new IPhone();  // iphone手机

              Phone *bsiphone = new ConcreteDecorator(iphone);  // iphone增加变声功能

              delete iphone;

              delete bsiphone;

}

 四、总结

  装饰模式是一个为已有功能的类动态添加更多功能的一种方式,各个功能的扩展相互独立,可以根据需要随意组合,但组合的顺序有先后。

  优点:

  1.有效避免了继承方式对扩展对象功能带来的灵活性差的问题

  2.通过组合而非继承的方式,实现了动态扩展对象的功能的能力

  3.符合高内聚、低耦合的设计思想

  

  缺点:

  1.装饰链不能过长,否则影响效率

  2.原始类接口不能改变,因为所有装饰器基类继承于原始类接口,类接口变化会导致所有装饰器的修改

 

 

 

 

 

 

0 0
原创粉丝点击