C++设计模式九、装饰模式。

前言

装饰:从字面的意思看就知道这是一个使一个类更加强大的方法。就好比装修房子一样,装饰之后才更加完美。但是可能会有一个疑问,想使一个类更加强大,直接增加类的方法不就可以了吗?为什么还要搞什么装饰模式这样的东西?但这样就违背了设计基本原则--开放封闭原则。我们不想改变原有对象结构的情况下,动态的给对象增加额外的功能或者职责,这就是装饰模式。装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。下面可以看出装饰类和被装饰的类的关系是聚合关系,相互可独立。

主要实现:

对一个类的功能进行扩展,其实说白了就是咱们小学学习的扩展句子。比如:“打电话”这个功能。具体实例为“使用魅族手机打电话”,装饰一下。“戴着耳机用魅族手机打电话”,再装饰一下,“我用耳机使用魅族手机打电话”。这样扩展之后,就可以根据自己需要来选择使用哪些具体的实例。

 

#include <iostream>
using namespace std;
class Phone
{
public:
	virtual void call() 
	{
		cout << "call" << endl;
	}
};
class MeiZu:public Phone
{
public:
	virtual void call()
	{
		cout << "Use MeiZu Phone call" << endl;
	}
};
class Decorator :public MeiZu
{
protected:
	MeiZu  *meizu;
public:
	void decorat(MeiZu *meizu)
	{
		this->meizu = meizu;
	}

	void call()
	{
		meizu->call();
	}
};
class Earphone :public Decorator
{
public:
	void call()
	{
	cout << "use earphone call" << endl;
	meizu->call();
	}
};
class Someone :public Decorator
{
public:
	void call()
	{
		cout << "some one will call" << endl;
		meizu->call();
	}

};
int main()
{
	MeiZu *mei = new MeiZu();
	Decorator *dec = new Decorator();
	dec->decorat(mei);
	Someone *som = new Someone();
	som->decorat(dec);
	Earphone *ear = new Earphone();
	ear->decorat(som);
	ear->call();
	return 0;
}

一点解释:

           1、装饰器模式,肯定有个装饰类,以上代码中就是Decorator ,是继承Meizu的,其他需要装饰的类就是继承这个装饰的类的Decorator 。

2、最后一条ear->call 首先会调用Earphone中的call,由于ear装饰了Someone类的实例som,所以会调用Someone的call,实例som又装饰了Decorator的实例dec,所以,又会调用Decorator的call,层层递进,实现装饰。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值