装饰器模式:属于结构型模式
基本原理:创建一个装饰器用来对一个现有对象添加新功能,不改变对象结构
主要流程:
1.根据对象创建一个修饰类,该修饰类要保持方法签名完整
2.在修饰类中根据需求添加新的功能
3.使用时将对象或对象的引用传入修饰类中
注意:修饰类要与对象在一定程度上一致,新的功能只在修饰类中添加
#include <iostream>
#include <string>
using namespace std;
//创建对象
class Role
{
public:
virtual void init() = 0;
};
class Warrior : public Role
{
private:
string name;
public:
Warrior(string name)
{
this->name = name;
}
void init()
{
cout<<"Role is "<<this->name<<endl;
}
};
//创建修饰类 并且继承原对象
class Skill : public Role
{
private:
Role *role;
public:
Skill(Role *role)
{
this->role = role;
}
void init()
{
role->init();
}
};
//扩展修饰类
class Skill_jianfa : public Skill
{
private:
string skillName;
public:
Skill_jianfa(Role *role, string skillName):Skill(role)
{
this->skillName = skillName;
}
void init()
{
Skill::init();
cout<<"learn skill is "<<this->skillName<<endl;
}
};
class Skill_qinggong : public Skill
{
private:
string skillName;
public:
Skill_qinggong(Role *role, string skillName):Skill(role)
{
this->skillName = skillName;
}
void init()
{
Skill::init();
cout<<"learn skill is "<<this->skillName<<endl;
}
};
class Skill_tishu : public Skill
{
private:
string skillName;
public:
Skill_tishu(Role *role, string skillName):Skill(role)
{
this->skillName = skillName;
}
void init()
{
Skill::init();
cout<<"learn skill is "<<this->skillName<<endl;
}
};
int main()
{
Role *role = new Warrior("zhan shi");
Skill *skill = new Skill(role);
Skill_tishu *tishu = new Skill_tishu(skill,"ti shu");
tishu->init();
Skill_qinggong *qinggong = new Skill_qinggong(skill,"qinggong");
qinggong->init();
Skill_jianfa *jianfa = new Skill_jianfa(skill,"jianfa");
jianfa->init();
return 0;
}