定义
Strategy策略模式 把易于变化的行为分别封装起来,让它们之间可以互相替换, 让这些行为的变化独立于拥有这些行为的客户。
GoF《设计模式》中说道:定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换。该模式使得算法可独立于它们的客户变化。
Command命令模式是一种对象行为型模式,它主要解决的问题是:在软件构建过程中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”的问题。
GoF《设计模式》中说道:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
区别
命令模式是含有不同的命令(含有接收者的请求):做不同的事情;隐藏接收者执行细节。常见菜单事件,
而策略模式含有不同的算法,做相同的事情;
区别在于是否含有接收者。命令模式含有,策略模式不含有。
c++代码
策略模式
#include <iostream.h> #include <fstream.h> #include <string.h> class Strategy; class TestBed { public: enum StrategyType { Dummy, Left, Right, Center }; TestBed() { strategy_ = NULL; } void setStrategy(int type, int width); void doIt(); private: Strategy *strategy_; }; class Strategy { public: Strategy(int width): width_(width){} void format() { char line[80], word[30]; ifstream inFile("quote.txt", ios::in); line[0] = '\0'; inFile >> word; strcat(line, word); while (inFile >> word) { if (strlen(line) + strlen(word) + 1 > width_) justify(line); else strcat(line, " "); strcat(line, word); } justify(line); } protected: int width_; private: virtual void justify(char *line) = 0; }; class LeftStrategy: public Strategy { public: LeftStrategy(int width): Strategy(width){} private: /* virtual */void justify(char *line) { cout << line << endl; line[0] = '\0'; } }; class RightStrategy: public Strategy { public: RightStrategy(int width): Strategy(width){} private: /* virtual */void justify(char *line) { char buf[80]; int offset = width_ - strlen(line); memset(buf, ' ', 80); strcpy(&(buf[offset]), line); cout << buf << endl; line[0] = '\0'; } }; class CenterStrategy: public Strategy { public: CenterStrategy(int width): Strategy(width){} private: /* virtual */void justify(char *line) { char buf[80]; int offset = (width_ - strlen(line)) / 2; memset(buf, ' ', 80); strcpy(&(buf[offset]), line); cout << buf << endl; line[0] = '\0'; } }; void TestBed::setStrategy(int type, int width) { delete strategy_; if (type == Left) strategy_ = new LeftStrategy(width); else if (type == Right) strategy_ = new RightStrategy(width); else if (type == Center) strategy_ = new CenterStrategy(width); } void TestBed::doIt() { strategy_->format(); } int main() { TestBed test; int answer, width; cout << "Exit(0) Left(1) Right(2) Center(3): "; cin >> answer; while (answer) { cout << "Width: "; cin >> width; test.setStrategy(answer, width); test.doIt(); cout << "Exit(0) Left(1) Right(2) Center(3): "; cin >> answer; } return 0; }
命令模式
#include <iostream> using namespace std; #define SAFE_DELETE(p) if (p) { delete p; p = NULL; } class Receiver { public: void Action() { cout<<"Receiver->Action"<<endl; } }; class Command { public: virtual void Execute() = 0; }; class ConcreteCommand : public Command { public: ConcreteCommand(Receiver *pReceiver) : m_pReceiver(pReceiver){} void Execute() { m_pReceiver->Action(); } private: Receiver *m_pReceiver; }; class Invoker { public: Invoker(Command *pCommand) : m_pCommand(pCommand){} void Invoke() { m_pCommand->Execute(); } private: Command *m_pCommand; }; int main() { Receiver *pReceiver = new Receiver(); Command *pCommand = new ConcreteCommand(pReceiver); Invoker *pInvoker = new Invoker(pCommand); pInvoker->Invoke(); SAFE_DELETE(pInvoker); SAFE_DELETE(pCommand); SAFE_DELETE(pReceiver); return 0; }