装饰模式(C++)

简述

    装饰器是为已经有的功能动态地添加更多功能的一种方式,当一个类需要新功能时,首先想到的是在旧的类中修改源代码,增加新的功能来装饰原来的核心功能。如果功能需求变化,就必须再次修改源码,不符合开闭原则。增加了类复杂性。

场景

    有一个Programmer类,他有两个成员函数 Work(), OffDuty(),想要给这两个成员函数添加新功能。并且这两个函数内部实现极复杂,所以直接修改这个类的代码是下下策,这时候装饰器模式就可以很好的实现了

UML类图

对象职责

Programmer:被装饰的对象

DecoratorProgrammer:装饰器,给Programmer添加功能

代码实现

#include <stdio.h>
#include <iostream>

class Programmer
{
public:
	Programmer() {};
	~Programmer() {};

	virtual void Work()
	{
		std::cout << "程序员 上班时间:写程序" << std::endl;
	}

	virtual void OffDuty()
	{
		std::cout << "程序员 上班时间:学习新技术" << std::endl;
	}
private:
};

class DecoratorProgrammer : public Programmer
{
public:
	DecoratorProgrammer(Programmer *programmer)
	{
		mProgrammer = programmer;
	}
	~DecoratorProgrammer() {}

	void setProgrammer(Programmer *programmer)
	{
		mProgrammer = programmer;
	}

	virtual void Work()
	{
		if (mProgrammer == NULL)
		{
			return;
		}
		mProgrammer->Work();
		std::cout << "新加功能: 修电脑" << std::endl;
	}
	virtual void OffDuty()
	{
		if (mProgrammer == NULL)
		{
			return;
		}
		mProgrammer->OffDuty();
		std::cout << "新加功能: 写博文" << std::endl;
	}

private:
	Programmer* mProgrammer;
};


void main(void)
{
	Programmer *p = new Programmer;
	p->Work();
	p->OffDuty();

	//添加装饰器
	Programmer *d1 = new DecoratorProgrammer(p);
	printf("\n-------------装饰后-------------\n");
	d1->Work();
	d1->OffDuty();

	while (1);

	return;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值