基本概念

(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类合并。

【设计模式6】装饰模式_#include

具体实现(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++)

【设计模式6】装饰模式_ios_02

//#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