您的位置:首页 > 编程语言 > C语言/C++

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

2014-04-23 17:29 453 查看
理论学习:

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

装饰者模式可以说是“给爱用继承的人一个全新的设计眼界”,装饰者模式提供了一种给类增加职责的方法,这种方法不是通过继承实现的,而是通过组合!

实例分析:


比如下面我自己用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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: