结构型模式2——装饰器模式

装饰器模式(Decorator Pattern)

装饰器模式允许向一个现有的对象添加新的功能,同时又不改变其结构,它是作为现有的类的一个包装。

以我们之前的Car为例,假设三种汽车我们需要给他们加上定速巡航或者自动刹车的功能,那么我们就需要通过实现子类的方式,重写接口,每增加一个功能,不同的车型都需要增加一个子类,这样理论上是可以完成功能的,但是代码中有太多的子类添加进来了。

动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比新增加子类实现更为灵活

使用时机: 在不想添加子类的情况下扩展类功能

解决方案: 将具体功能职责划分,同时继承装饰器模式。

class Car
{
public:
	virtual void show() = 0;
};

class BWM :public Car
{
public:
	void show() { cout << "this is BWM Car " ; }
};

class Audi :public Car
{
public:
	void show() { cout << "this is Audi Car " ; }
};

装饰器通过和产品继承自一个基类来达到不断对其修饰,针对一个自基类继承的方法,先是调用自身所指向的汽车对象,然后在后面写上所要增加的功能:

class CarDecorator :public Car
{
public:
	CarDecorator(Car* p) :pCar_(p) {}

	void show() = 0;
private:
	Car* pCar_;
};
//装饰器1:定速巡航
class ConcreteDecorator01 :public Car
{
public:
	ConcreteDecorator01(Car* p) :pCar_(p) {}

	void show()
	{
		pCar_->show();
		cout << "with curise control ";
	}
private:
	Car* pCar_;
};

//装饰器2:自动涉车
class ConcreteDecorator02:public Car
{
public:
	ConcreteDecorator02(Car* p) :pCar_(p) {}

	void show()
	{
		pCar_->show();
		cout << "with Automatic car involved ";
	}
private:
	Car* pCar_;
};

int main()
{
	Car* p1 = new ConcreteDecorator01(new BWM());
	Car* p2 = new ConcreteDecorator02(new Audi());
	p1->show();
	cout<<endl;
	p2->show();
	cout<<endl;
}

运行结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值