Added command example.

This commit is contained in:
Ian Dinwoodie
2019-05-19 18:20:38 -04:00
parent f3c4c9555f
commit cf35b0c37c

120
README.md
View File

@@ -1876,7 +1876,125 @@ parameters.
#### Programmatic Example
TODO
First of all we have the receiver that has the implementation of every action
that could be performed.
```cpp
// The receiver.
class Bulb
{
public:
void turnOn(void)
{
std::cout << "Bulb has been lit." << std::endl;
}
void turnOff(void)
{
std::cout << "Darkness!" << std::endl;
}
};
```
Then we have an interface that each of the commands are going to implement and
then we have a set of commands.
```cpp
class Command
{
public:
virtual void execute(void) = 0;
virtual void undo(void) = 0;
virtual void redo(void) = 0;
};
// A command.
class TurnOn : public Command
{
public:
TurnOn(std::shared_ptr<Bulb> bulb)
: bulb_(bulb)
{
}
void execute(void)
{
bulb_->turnOn();
}
void undo(void)
{
bulb_->turnOff();
}
void redo(void)
{
execute();
}
private:
std::shared_ptr<Bulb> bulb_;
};
// Another command.
class TurnOff : public Command
{
public:
TurnOff(std::shared_ptr<Bulb> bulb)
: bulb_(bulb)
{
}
void execute(void)
{
bulb_->turnOff();
}
void undo(void)
{
bulb_->turnOn();
}
void redo(void)
{
execute();
}
private:
std::shared_ptr<Bulb> bulb_;
};
```
Then we have an invoker with whom the client will interact to process any
commands.
```cpp
// The invoker.
class RemoteControl
{
public:
void submit(std::shared_ptr<Command> command)
{
command->execute();
}
};
```
Here is how this can be used:
```cpp
std::shared_ptr<Bulb> bulb = std::make_shared<Bulb>();
std::shared_ptr<TurnOn> turnOn = std::make_shared<TurnOn>(bulb);
std::shared_ptr<TurnOff> turnOff = std::make_shared<TurnOff>(bulb);
RemoteControl remote;
remote.submit(turnOn);
remote.submit(turnOff);
// Output:
// Bulb has been lit.
// Darkness!
```
Command pattern can also be used to implement a transaction based system. Where
you keep maintaining the history of commands as soon as you execute them. If the