装饰模式(Decorator)和Component不一样。
Decorator是一个透明的包装。如果我们从对象标识的观点出发,一个被装饰了的组件与这个组件是有差别的,因此,使用装饰时不应该依赖对象标识。
注意:
1、接口的一致性。装饰对象的接口必须与它所装饰的Component的接口是一致的。
2、省略抽象的Docorator类。当你仅需要添加一个职责的时,没有必要定义抽象Decorator类。你常常需要处理显存的类层次结构而不是设计一个新系统,这时你可以把Decorator向Component转发请求的职责合并到ConcreteDecorator中。
3、保持Component类的简单性。为了保证接口的一致性,组件和装饰必须有一个共同的Component父类。因此保持这个类的简单些是很重要的。
========================================================================================
222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
Decorator与component不一样。
Decorator是一个透明的包装。
注意:
1,接口的一致性。装饰对象的接口必须与它所装饰的Component的接口是一致的。
2,省略抽象的Docorator类。当你仅需要添加一个职责的时候,没有必要定义抽象Decorator类。
3,保持Component类的简单性。为了保证接口的一致性,组件和装饰必须有一个共同的Component父类。
============================================================
Decorator模式比生成子类模式更为灵活。
=========================================================
class absTable
{
public:
virtual void putTable() = 0;
};
class BaseTable : public absTable
{
public:
virtual void putTable()
{
print("姓名");
}
}
class Decorator : public absTable
{
public:
virtual void putTable()
{
mpAbsTable->putTable();
}
private"
absTable* mpAbsTable;
}
class EnglishDcrt : public Decorator
{
public:
EnglishDcrt(absTable* pTb):Decorator(pTb){}
virtual void putTable()
{
print("英语等级")
Decorator::putTable();
}
}
5555555555555555555555555555555555555555555555555555555555555555555555555
6666666666666666666666666666666666666666666666666666666666666666666666666
7777777777777777777777777777777777777777777777777777777777777777777777777
8888888888888888888888888888888888888888888888888888888888888888888888888
继承方式
关联方式
即将一个类对象嵌入另一个对象中,由另一个对象来决定是否调用嵌入对象的行为以便扩展自己的行为,我们称这个嵌入的对象为装饰器(Decorator)
装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展
装饰模式(Decorator Pattern) :动态地给一个对象增加一些额外的职责(Responsibility),就增加对象功能来说,装饰模式比生成子类实现更为灵活。其别名也可以称为包装(Wrapper),与适配器模式的别名相同,但它们适用于不同的场合。根据翻译的不同,装饰模式也有人称之为“油漆工模式”,它是一种对象结构型模式
Component定义一个对象接口,可以给这些对象动态的添加职责
Decorator维持一个指向
999999999999999999999999999999999999999999999999999999999999
888888888888888888888888888888888888888888888888888888888888
7777777777777777777777777777777777777777777777777777777777777
6666666666666666666666666666666666666666666666666666666666666
#include <iostream>
using namespace std;
class Component
{
public:
virtual void Operation() = 0;
};
class ConcreteComponent : public Component
{
public:
void Operation()
{
cout << "I am no decoratored ConcreteComponent" << endl;
}
};
class Decorator : public Component
{
public:
Decorator(Component *pComponent) : m_pComponentObj(pComponent) {}
void Operation()
{
if (m_pComponentObj != nullptr)
{
m_pComponentObj->Operation();//采用多态,运行时所指的动态类型调用对用的版本
}
}
protected:
Component *m_pComponentObj;
};
class ConcreteDecoratorA : public Decorator
{
public:
ConcreteDecoratorA(Component *pDecorator) : Decorator(pDecorator){}
void Operation()
{
Decorator::Operation();
AddedBehavior();
}
void AddedBehavior()
{
cout << "This is added behavior A." << endl;
}
};
class ConcreteDecoratorB : public Decorator
{
public:
ConcreteDecoratorB(Component *pDecorator) : Decorator(pDecorator){}
void Operation()
{
Decorator::Operation();
AddedBehavior();
}
void AddedBehavior()
{
cout << "This is added behavior B." << endl;
}
};
int main()
{
Component *pComponentObj = new ConcreteComponent();
Component *pDecoratorAOjb = new ConcreteDecoratorA(pComponentObj);
pDecoratorAOjb->Operation();
cout << "=============================================" << endl;
Component *pDecoratorBOjb = new ConcreteDecoratorB(pComponentObj);
pDecoratorBOjb->Operation();
cout << "=============================================" << endl;
Component *pDecoratorBAOjb = new ConcreteDecoratorB(pDecoratorAOjb);
pDecoratorBAOjb->Operation();
cout << "=============================================" << endl;
delete pDecoratorBAOjb;
pDecoratorBAOjb = nullptr;
delete pDecoratorBOjb;
pDecoratorBOjb = nullptr;
delete pDecoratorAOjb;
pDecoratorAOjb = nullptr;
delete pComponentObj;
pComponentObj = nullptr;
system("pause");
return 0;
}