【无标题】

2023-12-13 18:17:57


装饰模式(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;
}

文章来源:https://blog.csdn.net/lusic01/article/details/134948576
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。