设计模式——装饰器模式(C++实现)

博客介绍了装饰器模式,它是结构型设计模式,可在不改变现有类的基础上添加新功能,作为现有类的包装。其适用场景包括动态透明扩展单个对象职责、处理可撤销职责,以及不能用生成子类扩充时使用,还给出C++实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

装饰器模式简介:

         在不改变现有类的基础上添加新的功能,属于结构型设计模式,作为现有类的一个包装。

       适用场景

  1.   在不影响其他对象的情况下,以动态的、透明的方式扩展单个对象的职责。
  2. 处理那些可以撤销的职责
  3. 当不能采用生成子类的方法进行扩充时,可以使用装饰器设计模式

采用菜鸟教程的例子,这里用C++实现

#include<iostream>

using namespace std;

//创建一个形状的接口
class shape
{
public:
	shape() {};
	virtual ~shape() {};
	virtual void draw()=0;
};

//创建圆形circle类继承形状基类接口
class circle :public shape
{
public:
	circle(){};
	~circle(){};
	void draw();
};

void circle::draw()
{
	cout << "draw circle" << endl;
}

//创建一个三角形rectangle类继承形状shape基类
class rectangle :public shape
{
public:
	rectangle(){};
	~rectangle(){};
	void draw();
};

void rectangle::draw()
{
	cout << "draw rectangle" << endl;
}

//创建一个形状装饰器ShapeDecorator类继承形状shape基类
class ShapeDecorator:public shape
{
public:
	ShapeDecorator(shape *td);
	virtual ~ShapeDecorator(){};
	void draw();
protected:
	shape *decoratedshape;
};

ShapeDecorator::ShapeDecorator(shape *td)
{
	decoratedshape = td;
}

void ShapeDecorator::draw()
{
	decoratedshape->draw();
}

//扩展ShapeDecorator为RedShapeDecorator
class RedShapeDecorator : public ShapeDecorator
{
public:
	RedShapeDecorator(shape *tf);
	~RedShapeDecorator(){};
	void draw();
private:
	void setRedBorder(shape *tg);
};

RedShapeDecorator::RedShapeDecorator(shape *tf):ShapeDecorator(tf)
{
	
}

void RedShapeDecorator::draw()
{
	decoratedshape->draw();
	setRedBorder(decoratedshape);
}

//设置边框颜色
void RedShapeDecorator::setRedBorder(shape *tg)
{
	cout << "Border Color:Red" << endl;
}

int main()
{
	shape *redCircle = (shape*)new RedShapeDecorator(new circle());
	shape *redRectangle = (shape*)new RedShapeDecorator(new rectangle());
	redCircle->draw();
	redRectangle->draw();
	delete redCircle;
	delete redRectangle;
	system("pause");
	return 0;
}

在visual studio 2015上运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值