Composite模式及C++实现
作者:互联网
Composite模式
Composite类维护一个以父类(的指针)为元素的列表,它实际上是父类的代理,但任何可以使用父类或父类其他子类的地方也可以使用Composite类。
C++实现
/*这个Composite模式的实现是在实现Command模式的代码的基础上更改的,两个可以比较着看*/
#include<iostream>
#include<vector>
using namespace std;
class Command {
public:
virtual void doit() {
cout << "command\n";
}
};
//在CompositeCommand类中维护一个Command*的列表
//让CompositeCommand继承Command类,这样凡是可以用Command的地方都可以用CompositeCommand
//这样就实现了执行一个命令的代码和执行若干个命令的代码是一样的
class CompositeCommand : public Command {
public:
virtual void doit() {
for (auto i = commands.begin(); i != commands.end(); ++i) {
Command* command = *i;//*i -> doit(): error, 'cause *i isn't taken as a pointer
command->doit();
}
}
void add(Command* command) {//为了简单,这里只写了添加命令的代码,没写删除命令的
commands.push_back(command);
}
private:
vector<Command*> commands;
};
//下面是会绑定到Sensor上的三个命令
class TurnonCommand : public Command {
public:
virtual void doit() {
cout << "turn on\n";
}
};
class TurnoffCommand : public Command {
public:
virtual void doit() {
cout << "turn off\n";
}
};
class PrintCommand : public Command {
public:
virtual void doit() {
cout << "print\n";
}
};
//和Command模式比较会发现,Sensor类的代码是完全一样的
class Sensor {
public:
Sensor(Command* c) : command(c) {}
void sense() {
if (condition)
command->doit();
}
private:
bool condition = true;
Command* command;
};
int main() {
TurnonCommand turnOn = TurnonCommand();
PrintCommand print = PrintCommand();
TurnoffCommand turnOff = TurnoffCommand();
CompositeCommand commands = CompositeCommand();
commands.add(&turnOn);
commands.add(&print);
commands.add(&turnOff);
Sensor s = Sensor(&commands);//需要更改这个Sensor执行的命令时,
//只需要再初始化一个Command的derived class,
//然后添加到commands里就可以了,
//不需要更改Sensor的代码
s.sense();
return 0;
}
Composite模式的特点
将“一对多”的关系(比如一个Sensor和多个Command)转化为了“一对一”的关系(一个Sensor和一个CompositeCommand,CompositeCommand类中维护了一个以Command*为元素的列表),使得代码更容易维护,符合OCP。
但是该模式也有局限性:Composite类必须以相同方式对待列表的所有元素。例如,我们现在持有一个员工对象列表并在列表中搜寻今天发工资的员工,此时不以相同方式对待所有员工(有的发工资有的不发),因此不适合用Composite模式将“一对多”转换为“一对一”。
标签:commands,Composite,模式,doit,add,Command,C++,Sensor 来源: https://www.cnblogs.com/saltedreed/p/11884295.html