基本概念
(1)装饰模式(Decorator):动态地给对象添加一些额外的职责,就增加功能来说装饰模式比生成子类更为灵活;
(2)Component:定义一个接口对象,可以对这些对象动态地添加职责;
(3)ConcreteComponent:定义一个具体的对象,也可以对这些对象添加一些职责;
(4)Decorator:装饰抽象类,继承了Component,从外类来扩展Compenent 类的功能;
(5)ConereteDecorator:具体的装饰对象,可以有多个(ConereteDecoratorA、ConereteDecorator B…),起到给Component添加职责的功能。
(6)如果只有一个ConcreteComponent类而没有抽象的Component类那可以将Decorator设计为ConcreteComponent的子类,同理若ConereteDecorator只有一个类,那没必要建立 Decorator类,可以吧ConereteDecorator和Decorator类合并。
具体实现(VS,C++)
//#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<algorithm>
#include<xfunctional>
using namespace std;
class Component
{
public:
Component();
~Component();
virtual void Operation() = 0;
private:
};
class ConcreteComponent:public Component
{
public:
ConcreteComponent();
~ConcreteComponent();
void Operation() {
cout << "ConcreteComponent:具体对象的操作" << endl;
}
private:
};
class Decorator:public Component
{
public:
// 通过构造函数传递给被修饰者
Decorator(Component *component) {
this->component = component;
}
// 委托给被修饰者执行
void Operation() {
if (component != nullptr) {
this->component->Operation();
}
}
Decorator();
~Decorator();
private:
Component *component = nullptr;
};
class ConcreteDecoratorA:public Decorator
{
public:
ConcreteDecoratorA();
~ConcreteDecoratorA();
//定义被修饰者
ConcreteDecoratorA(Component *component) {
super1 = component;
}
//定义自己的修饰方法
void behavior1() {
cout << "behavior1:第一次修饰" << endl;
}
void Operation() {
super1->Operation();
this->behavior1();
}
private:
Component *super1;
};
class ConcreteDecoratorB:public Decorator
{
public:
ConcreteDecoratorB();
~ConcreteDecoratorB();
//定义被修饰者
ConcreteDecoratorB(Component *component) {
super2 = component;
}
// 定义自己的修饰方法
void behavior2() {
cout << "behavior2:第二次修饰" << endl;
}
void Operation() {
super2->Operation();
this->behavior2();
}
private:
Component *super2 = nullptr;
};
ConcreteDecoratorB::ConcreteDecoratorB()
{
}
ConcreteDecoratorB::~ConcreteDecoratorB()
{
delete super2;
}
ConcreteDecoratorA::ConcreteDecoratorA()
{
}
ConcreteDecoratorA::~ConcreteDecoratorA()
{
delete super1;
}
Decorator::Decorator()
{
}
Decorator::~Decorator()
{
delete component;
}
Component::Component()
{
}
Component::~Component()
{
}
ConcreteComponent::ConcreteComponent()
{
}
ConcreteComponent::~ConcreteComponent()
{
}
int main(int argc, char** argv)
{
Component *component = new ConcreteComponent();
component = new ConcreteDecoratorA(component);
component = new ConcreteDecoratorB(component);
component->Operation();
return 0;
}
具体案例(VS,C++)
//#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<string>
using namespace std;
class Person
{
public:
Person();
~Person();
Person(string name) {
this->name = name;
}
virtual void show() {
cout << "被装饰人:" << name << endl;
}
private:
string name;
};
class Finery:public Person
{
public:
Finery();
~Finery();
Finery(Person *person) {
this->person = person;
}
void show() {
if (person != nullptr) {
person->show();
}
}
private:
Person *person;
};
class TShirts:public Finery
{
public:
TShirts();
~TShirts();
TShirts(Person* per) {
this->per = per;
}
void show() {
per->show();
cout << "大 T 恤" << endl;
}
private:
Person* per;
};
class BigTrouser:public Finery
{
public:
BigTrouser();
~BigTrouser();
BigTrouser(Person *per) {
this->per = per;
}
void show() {
per->show();
cout << "短裤" << endl;
}
private:
Person *per;
};
BigTrouser::BigTrouser()
{
}
BigTrouser::~BigTrouser()
{
}
TShirts::TShirts()
{
}
TShirts::~TShirts()
{
delete per;
}
Finery::Finery()
{
}
Finery::~Finery()
{
delete person;
}
Person::Person()
{
}
Person::~Person()
{
}
int main(int argc, char** argv)
{
Person *dog = new Person("Bob");
dog = new TShirts(dog);
dog = new BigTrouser(dog);
dog->show();
delete dog;
return 0;
}
关于作者
长期从事编程相关研究,涉及Qt、机械臂、轮式机器人、四足机器人的建模及仿真,可共同探讨编程相关问题,可指导课程设计及毕业设计,详询:QQ:2963325158