装饰器模式中爷类初始化父类
时间: 2023-07-05 18:14:17 浏览: 49
在装饰器模式中,每个装饰器类都要继承自一个共同的抽象父类(或接口),这个父类包含了一些共同的方法,用于实现装饰器的基本功能。因此,在装饰器模式中,爷类(祖先类)并不需要初始化父类,而是通过继承来获取父类的功能。
以下是一个简单的装饰器模式的示例代码,用于实现对一个数字进行加密和解密:
```c++
class Number {
public:
virtual int getValue() = 0;
};
class SimpleNumber : public Number {
public:
SimpleNumber(int value) : m_value(value) {}
virtual int getValue() { return m_value; }
private:
int m_value;
};
class NumberDecorator : public Number {
public:
NumberDecorator(Number* pNumber) : m_pNumber(pNumber) {}
virtual int getValue() { return m_pNumber->getValue(); }
protected:
Number* m_pNumber;
};
class AddOneDecorator : public NumberDecorator {
public:
AddOneDecorator(Number* pNumber) : NumberDecorator(pNumber) {}
virtual int getValue() { return m_pNumber->getValue() + 1; }
};
class SubOneDecorator : public NumberDecorator {
public:
SubOneDecorator(Number* pNumber) : NumberDecorator(pNumber) {}
virtual int getValue() { return m_pNumber->getValue() - 1; }
};
```
在上面的示例代码中,抽象父类 `Number` 定义了一个抽象方法 `getValue()`,用于获取数字的值。子类 `SimpleNumber` 实现了这个方法,并保存了一个整数值。
装饰器类 `NumberDecorator` 继承了抽象父类 `Number`,并包含了一个指向抽象父类 `Number` 的指针成员变量。装饰器类的子类 `AddOneDecorator` 和 `SubOneDecorator` 分别实现了加一和减一的功能,通过调用父类的 `getValue()` 方法来获取原始数字的值,并在此基础上进行加一或减一的操作。
在使用时,可以通过装饰器类来对数字进行加密和解密:
```c++
Number* pNumber = new SimpleNumber(5);
pNumber = new AddOneDecorator(pNumber);
pNumber = new SubOneDecorator(pNumber);
int value = pNumber->getValue(); // value = 5
```
这里先创建了一个指向 `SimpleNumber` 对象的 `Number` 指针 `pNumber`,然后通过 `AddOneDecorator` 和 `SubOneDecorator` 对象进行装饰,最终得到了一个经过加密和解密的数字。