6. 装饰器

UML

  • 聚合(Aggregation)关系:大雁和雁群,上图中空心菱形+箭头表示聚合关系
  • 组合(Composition)关系:大雁和翅膀 ,实心菱形+箭头表示组合(Composition)关系

测试代码

cpp 复制代码
#include <iostream>
#include <stdio.h>
#include <mutex>//锁头文件
 
using namespace std;
 
class Component{
public:
    virtual void Operation() = 0;
    virtual ~Component(){
 
    }
};
class ConcreteComponent:public Component
{
public:
    void Operation(){
        cout << "ConcreteComponent" << endl;
    }
};
 
class Decorator:public Component{
protected:
    Component *component = nullptr;
public:
    void SetComponent(Component *_component){
        this->component = _component;
    }
    void Operation(){
        if(component != nullptr){
            component->Operation();
        }
    }
};
class ConcreteDecoratorA:public Decorator
{
private:
    string addedState;
public:
    void Operation(){
        Decorator::Operation();
        addedState = "new State";
        cout << "具体装饰对象A的操作" << endl;
    }
};
 
class ConcreteDecoratorB:public Decorator
{
public:
    void Operation(){
        Decorator::Operation();
        AddedBehavior();
        cout << "具体装饰对象B的操作" << endl;
    }
private:
    void AddedBehavior()
    {
        cout << "AddedBehavior" << endl;
    }
};
int main(void)
{
    ConcreteComponent *c = new ConcreteComponent();
    ConcreteDecoratorA *d1 = new ConcreteDecoratorA();
    ConcreteDecoratorB *d2 = new ConcreteDecoratorB();
    d1->SetComponent(c);
    d2->SetComponent(d1);
    d2->Operation();
    cout << "--endl--" << endl;
    return 0;
}
 

输出

复制代码
ConcreteComponent
具体装饰对象A的操作
AddedBehavior
具体装饰对象B的操作
--endl--

装饰模式是利用SetComponent来对对象进行包装的。这样每个装饰对象的实现就和如何使用这个对象分离开了,每个装饰对象只关心自己的功能,不需要关心如何被添加到对象链当中

装饰模式变身

如果只有一个ConcreteComponent类而没有抽象的Component类,那么Decorator类可以是ConcreteComponent的一个子类。同样道理,如果只有一个ConcreteDecorator类,那么就没有必要建立一个单独的Decorator类,而可以把Decorator和ConcreteDecorator的责任合并成一个类

根据这段文字的描述,UML结构图变身后的形态

C++改写后的UML图和代码

代码:

cpp 复制代码
#include <iostream>
#include <stdio.h>
#include <mutex>//锁头文件
 
using namespace std;
 
//"Person"类(ConcreteComponent)
class Person{
public:
    Person(){
    }
    Person(string _name):name(_name){
    }
    virtual void Show(){
        cout << "装扮的:" << this->name << endl;
    }
private:
    string name;
};
//服饰类(Decorator)
class Finery:public Person
{
public:
 
    Person *component = nullptr;
    void Decorate(Person *_component){
        this->component = _component;
    }
    virtual void Show(){
        if(component != nullptr){
            component->Show();
        }
    }
};
class fengyi:public Finery
{
public:
    virtual void Show(){
        cout << "风衣" << endl;
        Finery::Show();
    }
};
 
class yundongxie:public Finery
{
public:
    virtual void Show(){
        cout << "运动鞋" << endl;
        Finery::Show();
    }
};
class mojing:public Finery
{
public:
    void Show(){
        cout << "墨镜" << endl;
        Finery::Show();
    }
};
class kouzhao:public Finery
{
public:
    void Show(){
        cout << "口罩" << endl;
        Finery::Show();
    }
};
class xifu:public Finery
{
public:
    void Show(){
        cout << "西服" << endl;
        Finery::Show();
    }
};
int main(void)
{
    cout << "装扮1" << endl;
    Person *p1 = new Person("lkmao");
    fengyi *fy = new fengyi();
    yundongxie *ydx = new yundongxie();
    fy->Decorate(p1);
    ydx->Decorate(fy);
    ydx->Show();
 
    cout << endl << "装扮2" << endl;
    Person *p2 = new Person("laoliu");
    mojing *mj = new mojing();
    kouzhao *kz = new kouzhao();
    xifu *xf = new xifu();
    mj->Decorate(p2);
    kz->Decorate(mj);
    xf->Decorate(kz);
    xf->Show();
 
    cout << "--endl--" << endl;
    return 0;
} 

输出

复制代码
装扮1
运动鞋
风衣
装扮的:lkmao
 
装扮2
西服
口罩
墨镜
装扮的:laoliu
--endl--

参考:https://blog.csdn.net/yueni_zhao/article/details/128946954

相关推荐
逆向命运12 分钟前
PC企微搜索手机号窗口绕过
c语言·汇编·c++·飞书·企业微信
.千余19 分钟前
【C++】C++核心语法:函数重载与缺省参数原理与避坑
c语言·开发语言·c++·经验分享·笔记·git·学习
fpcc31 分钟前
C++编程实践——提高缓存的命中
c++·缓存
小张成长计划..37 分钟前
【C++】37:IO库(扩展)
c++
Cx330❀38 分钟前
【Qt 核心机制篇】深度解析 Qt 信号与槽(Signals & Slots)机制:从底层原理、实战演练到 Lambda 进阶
linux·开发语言·c++·人工智能·qt·ubuntu
学习,学习,在学习39 分钟前
Modbus TCP同步通信方式实现异步级效率
网络·c++·qt·网络协议·tcp/ip·qt5
Cx330❀42 分钟前
【Linux网络】从零构建高性能UDP服务器:从Echo到英译汉业务级实现
大数据·linux·服务器·开发语言·网络·c++·udp
不吃土豆的马铃薯1 小时前
TCP 三次握手 / 四次挥手详解
服务器·开发语言·网络·c++·网络协议·tcp/ip
羑悻的小杀马特1 小时前
【动态规划篇】正则表达式与通配符:开启代码匹配的赛博奇幻之旅
c++·算法·leetcode·正则表达式
Huangjin007_1 小时前
【C++ STL篇(十三)】无序关联容器 unordered_set / unordered_map解析
开发语言·c++