设计模式——命令模式(C++实现)

命令模式简介

               命令模式 将请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。行为型模式。

适用场景

             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上运行结果:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值