设计模式之装饰者模式

来源:互联网 发布:淘宝上买的车衣不耐用 编辑:程序博客网 时间:2024/04/26 23:32

设计模式之装饰者模式

         装饰者模式动态地将责任附加到对象上,运用对象组合在运行时进行装饰。装饰者模式提供了比继承更加灵活的扩展功能方案。

         装饰者模式体现了开放-关闭原则,即类对扩展开放,对修改关闭。其类图如下:

 

装饰者模式的特点:
1. 装饰者和被装饰者拥有相同的超类型(可能是抽象类也可能是接口)
2. 可以用多个装饰类来包装一个对象,装饰类可以包装装饰类或被装饰对象
3. 因为装饰者和被装饰者拥有相同的抽象类型,因此在任何需要原始对象(被包装)的场合,都可以用装饰过的对象来替代它。
4. 装饰者可以在被装饰者的行为之前或之后,加上自己的附加行为,以达到特殊目的
5. 因为对象可以在任何的时候被装饰,所以可以在运行时动态地、不限量地用你喜欢的装饰者来装饰对象

装饰者模式的使用场景:

如果需要添加新功能,但又不想修改定义好的接口或者抽象类,那么这时候就比较适合装饰模式,例如很多图形系统中的组件,就可以使用装饰模式,来让新的组件在继承现在功能的基础上添加新的功能。装饰模式一般是针对接口或者抽象类的变化,如果是具体实现类的变化,则要考虑适用哪种模式。

优点:

1.可以不用修改原有的接口,就可以实现新功能的添加。

2.装饰者可以很方便的转换原有接口中的实现,可以给装饰者指定不同ConcreteComponent实现不同的功能。

缺点:

1.复杂性增加,装饰者模式会导致许多小类的产生。

以手机为例说明装饰者模式:

1、创建一个phone超类:

class phone

{

public:

     phone(){}

     virtual ~phone(){}

     virtual int cost()=0;

     virtual void showcost()=0;

};

2、创建两种具体的手机:iphone和hwphone

#include "phone.h"

#include <string>

 

class iphone: public phone

{

private:

      string m_name;

public:

      iphone(string name):m_name(name){}

      virtual ~iphone(){}

      int cost()

      {

           return6999;

      }

      void showcost()

      {

           cout<<m_name<<"cost:"<<cost()<<endl;

      }

};

 

class hwphone: public phone

{

private:

      string m_name;

public:

      hwphone(string name):m_name(name){}

      virtual ~hwphone(){}

      int cost()

      {

           return3999;

      }

      void showcost()

      {

           cout<<m_name<<"cost:"<<cost()<<endl;

      }

};

3、创建装饰者接口类:

#include "phone.h"

 

class Decorator: public phone

{

public:

      Decorator(){}

      virtual~Decorator(){}

      virtual int cost()=0;

      virtual void showcost()=0;

};

4、创建两种装饰对象:贴膜和手机套:

#include "decorator.h"

#include <iostream>

 

using namespace std;

 

class ScreenProtector: publicDecorator

{

private:

      phone* m_phone;

public:

      ScreenProtector(phone* pphone): m_phone(pphone){}

      ~ScreenProtector(){}

      int cost()

      {

           return20 + m_phone->cost();

      }

      void showcost()

      {

           m_phone->showcost();

           cout<<"ScreenProtector + phone cost:"<<cost()<<endl;

      }

};

 

class PhoneCover: public Decorator

{

private:

      phone* m_phone;

public:

      PhoneCover(phone* pphone):m_phone(pphone){}

      ~PhoneCover(){}

      int cost()

      {

           return5 + m_phone->cost();

      }

      void showcost()

      {

           m_phone->showcost();

           cout<<"PhoneCover + phone cost:"<<cost()<<endl;

      }

};

5、随意地为自己的手机增加装饰吧

#include "concretedecorator.h"

#include "concretephone.h"

 

int main()

{

      iphone Myihone("Ihone4");// Iphone手机

      hwphone Myhwphone("P10");// hwphone手机

 

      ScreenProtectorMyScreenProtectorPhone(&Myihone); //Iphone手机贴膜

      MyScreenProtectorPhone.showcost();

 

      PhoneCoverMyPhoneCover(&MyScreenProtectorPhone);//再给手机增加一个手机套

      MyPhoneCover.showcost();

 

      PhoneCoverMyHwPhoneCover(&Myhwphone);// HW手机加个手机套

      MyHwPhoneCover.showcost();

 

      ScreenProtectorMyHwPhoneSreenProtector(&MyHwPhoneCover); // HW手机贴膜

      MyHwPhoneSreenProtector.showcost();

 

      return 0;

}

原创粉丝点击