职责链模式
按照顺序调用功能函数,依次对目标对象进行处理
实现代码
#include<vector>
#include<string>
#include<map>
#include<iostream>
using namespace std;
//人物属性
struct Creature {
string name;
int attack, defense;
};
class CreatureModifier //修改器的基类
{
CreatureModifier* next{ nullptr }; //链结构
protected:
Creature& creature; //存储的人物
public:
explicit CreatureModifier(Creature& creature) : creature{ creature } {} //初始化
void add(CreatureModifier* cm) { //新增到链尾
if (next)next->add(cm);
else next = cm;
}
virtual void handle() { //处理链上所有函数
if (next)next->handle();
}
};
class DoubleAttackModifier :public CreatureModifier { //继承修改功能
public:
explicit DoubleAttackModifier(Creature& creature)
:CreatureModifier(creature) {}
void handle()override {
creature.attack *= 2;
CreatureModifier::handle(); //注意:需要调用基类的句柄,实现运行职责链上所有函数
}
};
int main()
{
Creature a{"lbc",10,10}; //列表初始化
DoubleAttackModifier d1(a); //设置两个修改器
DoubleAttackModifier d2(a);
d1.add(&d2); //放在职责链上
d1.handle(); //从头运行
cout << a.attack; //output:40
return 0;
}
总结
职责链模式允许组件一次处理命令,实现是通过维护一个指针链