命令模式简介
命令模式 将请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。行为型模式。
适用场景
1、在面向对象中使用回调机制,可以使用命令模式,它是回调机制在面向对象中的一个替代品。
2、在不同的时刻指定、排列以及执行请求。
3、支持取消操作、修改日志
4、用构建在原语操作上的高层操作构造一个系统。
采用菜鸟教程的例子,这里用C++实现
#include<iostream>
#include<string>
#include<list>
using namespace std;
//创建命令接口Order类
class Order
{
public:
Order() {};
virtual ~Order() {};
virtual void execute()=0; //抽象接口,执行命令
};
//创建一个请求类Stock
class Stock
{
public:
Stock(string tname, int quanty);
~Stock() {};
void buy();
void sell();
private:
string name;
int quantity;
};
Stock::Stock(string tname, int quanty)
{
this->name = tname;
this->quantity = quanty;
}
void Stock::buy()
{
cout << "Stock [ Name: " << name << " ,Quantity: " << quantity << " bought" << endl;
}
void Stock::sell()
{
cout << "Stock [ Name: " << name << " ,Quantity: " << quantity << " sold" << endl;
}
//创建实现命令接口的实体类BuyStock
class BuyStock :public Order
{
public:
BuyStock(Stock *abcStock);
~BuyStock() {};
void execute();
private:
Stock *abcstock; //请求类成员变量
};
BuyStock::BuyStock(Stock *abcStock)
{
this->abcstock = abcStock;
}
void BuyStock::execute()
{
abcstock->buy();
}
//创建实现命令接口的实体类SellStock
class SellStock :public Order
{
public:
SellStock(Stock *abcStock);
~SellStock() {};
void execute();
private:
Stock *abcstock;
};
SellStock::SellStock(Stock *abcStock)
{
this->abcstock = abcStock;
}
void SellStock::execute()
{
abcstock->sell();
}
//命令调用类Broker
class Broker
{
public:
Broker() {};
~Broker() {} ;
void takeOrder(Order *torder);
void placeOrder();
private:
list<Order*> orderlist; //命令列表
};
void Broker::takeOrder(Order *torder)
{
orderlist.push_back(torder);
}
void Broker::placeOrder()
{
list<Order*>::iterator it;
for (it = orderlist.begin(); it != orderlist.end(); ++it)
{
(*it)->execute();
}
orderlist.clear();
}
int main()
{
Stock *tbcstock = new Stock("ADE", 10);
Order *buystock =(Order *) new BuyStock(tbcstock);
Order *sellstock =(Order *)new SellStock(tbcstock);
Broker *broker =new Broker();
broker->takeOrder(buystock);
broker->takeOrder(sellstock);
broker->placeOrder();
delete tbcstock;
tbcstock = NULL;
delete buystock;
buystock = NULL;
delete sellstock;
sellstock = NULL;
delete broker;
broker = NULL;
system("pause");
return 0;
}
在visual studio 2015上运行结果: