最最简单的装饰器模式

这里要说的是这个叫做“装饰器”的设计模式的最最简单的C++实现。

装饰器模式实际上是为了解决客户程序需要新功能,但是既不能修改已有类库,又不好多改客户程序的目的提出的,它通过继承并包裹既有的类,实现对已有类的功能的扩充。可以看到,这个模式很好的体现了设计模式中对修改封闭,对扩充开放的基本原则,对于原始类B和原始客户代码都没有修改,但却通过增加新的代码直接提供了新的功能。代码如下:

#include <iostream>
using namespace std;
//基类:为了能够被装饰,这个必须是个能够被继承的类
class B
{
public:
    B(char n): c(n) {}
    B(): c('X') {}
    ~B() {}
    //可以被扩充功能的方法,需要多态特性,以便子类进行扩充
    //目前的功能就是显示一个字符,这个字符是用这个基类包裹的
    virtual void display() { cout << c ; }
private:
    char c;
};

//抽象装饰器:开始进行功能扩充的框架,继承基类并且包裹基类
class A : public B
{
public:
    A(B &t): b(t) {}
    ~A() {}
    //覆盖基类的功能,但是,呵呵,实际上只是把控制传递到被包裹的基类
    //可别忘了,这时的b可是基类引用,这是有多态机制的调用
    void display() { b.display(); }
private:
    B &b;
};

//真正的装饰功能,扩充实际功能,多显示一个字符,就是那个n,它会重新包裹这个字符
class C : public A
{
public:
    C(B &t, char n): A(t) , c(n) {};
    ~C(){}
    void display()
    {
        cout << c;
        //非常关键的一步,将控制转发给上一层继承的同名函数,
        //因为是直接在内部发起调用,这个可没有多态
        A::display();
     } 
private:
     char c; 
}; 

int main() 
{
     B *p_obj = new B('A'); //原始代码,不修改
     p_obj = new C(*p_obj, 'B'); //增加的代码
     p_obj =  new C(*p_obj, 'C'); //增加的代码
     //原本的程序功能,就是显示一个A。
     //现在增加了两层包裹,就可以多显示两个字母咯
     p_obj->display(); //原始代码,不修改
    cout << endl;
}
此条目发表在软件使用与程序设计分类目录。将固定链接加入收藏夹。