设计模式之装饰模式

装饰模式

 装饰模式(Decorator Pattern):动态地给一个对象增加一些额外的职责, 就增加对象功能来说,装饰模式比生成子类实现更为灵活。装饰模式是一种对象结构型模式。

设计模式之装饰模式_第1张图片

 

例子结构:

设计模式之装饰模式_第2张图片

 代码:

// Decorator.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include 

using namespace std;

//装饰模式
class Phone
{
public:
	virtual void show() = 0;  //虚继承
};

class iPhone : public Phone
{
public:
	virtual void show()
	{
		cout <<" 拿出来iPhone" <phone = phone;
	}

	virtual void show() = 0;

protected:
	Phone * phone; //拥有一个 所有手机的父类指针
};

//具体的手机贴膜装饰器
class MoDecorator :public Decorator
{
public:
	MoDecorator(Phone *phone) : Decorator(phone) {}
	virtual void show() {
		this->phone->show();  //保持原有的show

		this->mo(); //额外添加一个 mo的方法
	}

	//膜装饰器,可以修饰添加的方法
	void mo() {
		cout << "手机有了贴膜" << endl;
	}
};


//给手机加一个皮套的装饰器类
class TaoDecorator : public Decorator
{
public:
	TaoDecorator(Phone *phone):Decorator(phone) {} //这里就把指针给了父类
	virtual void show() {
		this->phone->show();
		tao();
	}

	void tao() {
		cout << "手机有了皮套" << endl;
	}
};


int main()
{
	Phone *phone = new iPhone;
	phone->show();
	cout << " -----  " << endl;
	Phone * moPhone = new MoDecorator(phone);
	moPhone->show();
	cout << " -----  " << endl;
	Phone * taoPhone = new TaoDecorator(phone);
	taoPhone->show();

	cout << " ------  " << endl;
	Phone *moTaoPhone = new TaoDecorator(moPhone);
	moTaoPhone->show(); //moPhone.show() + tao() ==  phone.show() + mo() + tao();

    return 0;
}

输出结果:

 拿出来iPhone
 -----
 拿出来iPhone
手机有了贴膜
 -----
 拿出来iPhone
手机有了皮套
 ------
 拿出来iPhone
手机有了贴膜
手机有了皮套
请按任意键继续. . .

我们可以看到,可以不断的装饰下去,这样我们可以把对应的功能给加上去了,十分的方便与现实非常结合。

优缺点:

优点:
(1) 对于扩展一个对象的功能,装饰模式比继承更加灵活性,不会导致类的个数
急剧增加。
(2) 可以通过一种动态的方式来扩展一个对象的功能,从而实现不同的行为。
(3) 可以对一个对象进行多次装饰。
(4) 具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构
件类和具体装饰类,原有类库代码无须改变,符合“开闭原则”。
缺点:
(1) 使用装饰模式进行系统设计时将产生很多小对象,大量小对象的产生势必会
占用更多的系统资源,影响程序的性能。 

 

你可能感兴趣的:(设计模式,设计模式,装饰类模式,c++,编程语言)