一、UML图
二、概念
装饰模式:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
三、说明
角色:
(1)Component是定义一个对象,可以给这些对象动态地添加职责。
(2)ConcreteComponent是定义了一个具体的对象,也可以给这个对象增加一些职责。
(3)Decorator,装饰抽象类,继承了Component,从外类来扩展Component类的功能,但是对于Component来说,是无需知道Decorator的存在的。
(4)至于ConcreteDecorator就是具体的装饰对象,起到给Component添加职责的作用。
什么时候用:
(1)需要在内部组装完成再显示出来的情况。
(2)类似于建造者模式,但是建造者模式的要求见到的过程必须是稳定的,而装饰模式的建造过程是不稳定的。
(3)我们需要把所需的功能按正确的顺序串联起来进行控制。
优点:
(1)把类的装饰功能从类中搬移去除,这样可以简化原有的类。
(2)有效地把类的核心职责和装饰功能区分开来,而且可以去除相关类中重复的装饰逻辑。
四、C++实现
(1)Conponent即ConcreteComponent类:此处为Person类
#ifndef PERSON_H #define PERSON_H #include <string> #include <iostream> //ConcreteComponent即Component class Person { private: std::string name; public: Person(){}; Person(std::string name) { this->name=name; } virtual void Show() { std::cout<<"装饰的"<<name<<std::endl; } }; #endif
(2)Decorator及ConcreteDecorator:此处为Finery及其子类
#ifndef FINERY_H #define FINERY_H #include <iostream> #include "Person.h" //Decorator类 class Finery:public Person { protected: Person* component; public: void Decorator(Person* component) { this->component=component; } void Show() { if(component!=NULL) component->Show(); } }; //下面是一系列ConcreteDecorator类 class TShirts:public Finery { public: void Show() { std::cout<<"大T恤 "; Finery::Show(); } }; //ConcreteDecorator类 class BigTrouser:public Finery { public: void Show() { std::cout<<"垮裤 "; Finery::Show(); } }; //ConcreteDecorator类 class Sneakers:public Finery { public: void Show() { std::cout<<"破球鞋 "; Finery::Show(); } }; //ConcreteDecorator类 class Suit:public Finery { public: void Show() { std::cout<<"西装 "; Finery::Show(); } }; //ConcreteDecorator类 class Tie:public Finery { public: void Show() { std::cout<<"领带 "; Finery::Show(); } }; //ConcreteDecorator类 class LeatherShoes:public Finery { public: void Show() { std::cout<<"皮鞋 "; Finery::Show(); } }; #endif
(3)客户端:main
#include "Finery.h" #include <string> #include <iostream> //客户端 void main() { Person* xc=new Person("小菜"); std::cout<<"第一种装扮:"<<std::endl; Sneakers* pqx=new Sneakers(); BigTrouser* kk=new BigTrouser(); TShirts* dtx=new TShirts(); pqx->Decorator(xc); kk->Decorator(pqx); dtx->Decorator(kk); dtx->Show(); std::cout<<"第二种装扮:"<<std::endl; LeatherShoes* px=new LeatherShoes(); Tie* ld=new Tie(); Suit* xz=new Suit(); px->Decorator(xc); ld->Decorator(px); xz->Decorator(ld); xz->Show(); std::cout<<" "<<std::endl; system("pause"); }
五、输出
时间: 2024-10-16 18:43:11