装饰者模式及C++代码实现

本文详细解释了装饰者模式的概念及其在解决面向对象设计中的问题时的优势,通过C++代码实例展示了如何使用装饰者模式为不同类添加新职责而不影响原有类结构,从而简化了系统复杂性和维护难度。

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

         理论学习:
        今天自学了装饰者模式,在面向对象设计和开发过程中,可能会经常遇到这种情况:我们需要为一个已经定义好的类添加新的职责(操作),通常情况下我们会定义一新的类继承自我们已经定义好的类,这样的话就会带来一个问题!你想想假如我们每一次给定义好的类增加功能时都用继承的方式,那么如果我的功能比较多时,用于继承的也就多了!这样做会很大程度上增加系统的复杂性!再者滥用继承还会使系统模块与模块之间的独立性变差,使得系统的耦合性增强,增加系统的维护难度! 
        装饰者模式可以说是“给爱用继承的人一个全新的设计眼界”,装饰者模式提供了一种给类增加职责的方法,这种方法不是通过继承实现的,而是通过组合! 
        实例分析:

        比如下面我自己用C++写的一个程序。程序的意图是为了增强战斗机的战斗力,现在我们需要给F5、F6、F8三种战斗机增加功能:给F5增加两栖和重机枪功能,给F6增加红外线功能和超级炸弹功能,给王牌F8增加Gps导航功能,两栖和重机枪功能,红外线功能和超级炸弹功能。假设我们通过传统的继承的方法去实现,那么这样会带来一个很严重的问题! 比如给王牌F8增加Gps导航功能,两栖和重机枪功能,红外线功能和超级炸弹功能,假如我们用继承的方法去实现的话,对F8的继承总共要继承三层,继承层次超过两层这无论是对系统的复杂性还是耦合性或者可维护性都是不利的!! 现在对F8增加三个功能,我不用继承去实现而用组合是实现,无论是类的继承层次还是类的数量,显然是简洁多了!   
                                                                                        2014.4.23                               
装饰者模式C++代码实现:

#include <string>  
#include <iostream>   
using namespace std;

//抽象类Fighter_aircraft(战斗机) 
class Fighter_aircraft
{//定义Fighter_aircraft的基本功能的抽象接口
public:
	virtual void shot() = 0;
	virtual void fly() = 0;
};

//具体类 F5_Fighter
class F5_Fighter :public Fighter_aircraft
{
public:
	virtual void shot()
	{
		cout<<"F5_Fighter shot"<<endl;
	}
	virtual void fly()
	{
		cout <<"F5_Fighter fly"<< endl;
	}
};

//具体类 F6_Fighter 
class F6_Fighter :public Fighter_aircraft
{
public:
	virtual void shot()
	{
		cout << "F6_Fighter shot"<< endl;
	}
	virtual void fly()
	{
		cout <<"F6_Fighter fly"<< endl;
	}
};


//具体类 F8_Fighter 
class F8_Fighter :public Fighter_aircraft
{
public:
	virtual void shot()
	{
		cout << "F8_Fighter shot" << endl;
	}
	virtual void fly()
	{
		cout << "F8_Fighter fly" << endl;
	}
};


//抽象类,增加战斗机的功能  
class AddFunction :public Fighter_aircraft
{
public:
	void Decorate(Fighter_aircraft*fa)
	{
		this->fa = fa;
	}

	virtual void shot()
	{
		fa->shot();
	}
	virtual void fly()
	{
		fa->fly();
	}
protected:
	Fighter_aircraft*fa;
};


//增加红外线和超级炸弹功能
class infrared_superbomb : public AddFunction
{
public:
	void set_infrared(string infrared)
	{
		this->infrared = infrared;
	}

	string get_infrared()
	{
		return infrared;
	}
public:
	void set_superbomb(string superbomb)
	{
		this->superbomb = superbomb;
	}

	string get_superbomb()
	{
		return superbomb;
	}
public:
	virtual void fly()
	{
		AddFunction::fly();
		set_infrared("增加红外线功能!");
		cout << get_infrared() << endl;
	}

	virtual void shot()
	{
		AddFunction::shot();
		set_superbomb("增加超级炸弹功能!");
		cout << get_superbomb() << endl;
	}

private:
	string infrared;
	string superbomb;
};


//增加两栖和重机枪功能
class amphibian_heavygun : public AddFunction
{
public:
	void set_amphibian(string amphibian)
	{
		this->amphibian = amphibian;
	}

	string get_amphibian()
	{
		return amphibian;
	}
public:
	void set_heavygun(string heavygun)
	{
		this->heavygun = heavygun;
	}
	string get_heavygun()
	{
		return heavygun;
	}
public:
	virtual void fly()
	{
		AddFunction::fly();
		set_amphibian("增加两栖功能!");
		cout << get_amphibian() << endl;
	}

	virtual void shot()
	{
		AddFunction::shot();
		set_heavygun("增加重机枪功能!");
		cout << get_heavygun() << endl;
	}

private:
	string amphibian;
	string heavygun;
};


//增加GPS定位功能
class GPS_function :public AddFunction
{
public:
	void set_GPS(string GPS)
	{
		this->GPS = GPS;
	}

	string get_GPS()
	{
		return GPS;
	}

public:
	virtual void fly()
	{
		AddFunction::fly();
		set_GPS("增加GPS定位功能");
		cout << get_GPS() << endl;
	}

	virtual void shot()
	{
		AddFunction::shot();
	}

private:
	string GPS;
};


int main(void)
{
	//给F5_Fighter增加两栖和重机枪功能
	cout <<endl<< "F5_Fighter:" << endl;
	Fighter_aircraft*f1 = new F5_Fighter;
	AddFunction*f2 = new amphibian_heavygun;
	f2->Decorate(f1);
	f2->fly();
	f2->shot();
	cout << "-------------------------" << endl;
	delete f1;
	delete f2;


	//给F6_Fighter增加红外线功能和超级炸弹功能
	cout <<endl<< "F6_Fighter:" << endl;
	Fighter_aircraft*f3 = new F6_Fighter;
	AddFunction*f4 = new infrared_superbomb;
	f4->Decorate(f3);
	f4->fly();
	f4->shot();
	cout << "-------------------------"<< endl;
	delete f3;
	delete f4;


	//给 F8_Fighter 增加Gps导航功能,两栖和重机枪功能,红外线功能和超级炸弹功能
	cout <<endl<< "F8_Fighter" << endl;
	Fighter_aircraft*f5 = new F8_Fighter;
	AddFunction*f6 = new GPS_function;
	AddFunction*f7 = new amphibian_heavygun;
	AddFunction*f8 = new infrared_superbomb;
	f6->Decorate(f5);
	f7->Decorate(f6);
	f8->Decorate(f7);
	f8->fly();
	f8->shot();
	cout <<endl<< endl;
	delete f5;
	delete f6;
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值