装饰器(Decorater)

来源:互联网 发布:波士顿矩阵图,何种业务 编辑:程序博客网 时间:2024/05/17 23:14

装饰器(Decorator)是一种对象结构型设计模式。

1.目的

动态地给一个对象添加一些职责。别名称为包装器(Wrapper)。

2.使用范围

(1)在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责;采用装饰器,可以在动态运行时刻添加和分离的方式增加和删除职责,相比较静态继承而言,有着更大的灵活性。

(2)对不能采用子类的方法进行扩充。可以避免子类数目的爆炸性增长,或者类定义被隐藏和类定义为不能用于生成子类时同样可以扩充。

3.优缺点

(1)装饰器不同于其组件,它只是对组件的一个透明的包装。

(2)避免了在层次结构高层的类有太多的特征。这些特征都可以通过装饰器去履行职责。

4.代码示例

这里加入我们要建立一个房间,需要用花和木板去装饰。则可以定义一个抽象的公共基类包含所有组件和装饰器的接口,并让装饰器包含一个公共基类的指针从而完成动态调用。如下:

////  Decorator.h//  Decorator////  Created by chenhuamin on 14-5-22.//  Copyright (c) 2014年 chenhuamin. All rights reserved.#ifndef Decorator_h#define Decorator_h#include <iostream>using namespace std;/****************************************   装饰器模式(Decorator)用于动态地给一个对象 添加一些额外的职责。   这里打算建造一个房间,并用花装饰器和木板装饰 器对房间进行构造。 ***************************************/class Room{public:virtual void Decorate(){}};//my roomclass MyRoom:public Room{public:    MyRoom(){}    virtual void Decorate(){}};//decoratorclass Decorator:public Room{public:    Decorator(Room* room):_room(room){}    virtual void Decorate()    {_room->Decorate();    }protected:    Room* _room;};//Concrete decoratorclass FowlerDecorator:public Decorator{public:    FowlerDecorator(Room* room):Decorator(room){}    virtual void Decorate()    {Decorator::Decorate();        cout<<"Fowler is decorated in your room~"<<endl;    }    };class BoardDecorator:public Decorator{public:    BoardDecorator(Room* room):Decorator(room){}    virtual void Decorate()    {        Decorator::Decorate();        cout<<"Board is decorated in your room~"<<endl;    }};#endif


5.测试用例

 Room* myroom=new MyRoom;    Room* p=new BoardDecorator(new FowlerDecorator(myroom));    p->Decorate();


 

0 0
原创粉丝点击