命令模式
命令模式(Command Pattern)是一种数据驱动的设计模式。属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象。该对象执行命令。
解决的问题
在软件系统中,行为的请求者和行为的实现者是一种紧耦合的关系。当我们要对行为进行记录、撤销、或者重做、事物等处理时,这样紧耦合的设计就不太适合。
为了让行为的请求者和行为的实现者解耦。我们将一组行为抽象成对象,通过调用者调用接受者来执行命令。顺序为调用者->命令->接受者
优点
- 降低系统耦合度
- 新的命令很容易添加到系统中
缺点
- 命令模式会导致系统有过多的具体命令类
命令模式实现
- 创建一个命令调用者Broker
- 向命令调用者Broker添加命令(BuyStock和SellStock)
- 命令调用者调用对应的接受者去执行命令。
1.1 创建一个命令接口
//Order 订单命令接口
type Order interface {
Execute()
}
1.2 创建请求类
我们使用一直股票类作为请求类。
//Stock 股票类
type Stock struct {
Name string
Quantity int
}
//NewStock 实例化一只股票
func NewStock() *Stock {
return &Stock{
Name: "maotai",
Quantity: 100,
}
}
//Buy 股票的买方法
func (s *Stock) Buy() {
fmt.Printf("Stock [ Name: %s, Quantity: %d ] bought.\n",
s.Name,
s.Quantity)
}
//Sell 股票的卖方法
func (s *Stock) Sell() {
fmt.Printf("Stock [ Name: %s, Quantity: %d ] sold.\n",
s.Name,
s.Quantity)
}
1.3 创建订单接口的实体类
这里订单接口的实体类,就是命令的实体类。
//BuyStock 买股票类,实现了Order接口的订单类
type BuyStock struct {
StockToBy Stock
}
//NewBuyStock 实例化买股票订单类
func NewBuyStock(st Stock) *BuyStock {
return &BuyStock{
StockToBy: st,
}
}
//Execute 处理买股票订单
func (bs *BuyStock) Execute() {
bs.StockToBy.Buy()
}
//SellStock 卖股票类,实现了Order接口的订单类
type SellStock struct {
StockToSell Stock
}
//NewSellStock 实例化卖股票订单类
func NewSellStock(st Stock) *SellStock {
return &SellStock{
StockToSell: st,
}
}
//Execute 处理卖股票订单
func (ss *SellStock) Execute() {
ss.StockToSell.Sell()
}
1.4 实现命令调用类
这里将股票经纪人作为命令的调用者。
//NewBroker 实例化命令调用类
func NewBroker() *Broker {
return &Broker{
OrderList: list.New(),
}
}
//TakeOrder 添加命令
func (b *Broker) TakeOrder(order Order) {
b.OrderList.PushBack(order)
}
//PlaceOrders 处理命令
func (b *Broker) PlaceOrders() {
for i := b.OrderList.Front(); i != nil; {
//处理完一个指令,就将该指令删除
nextOrder := i.Next()
i.Value.(Order).Execute()
b.OrderList.Remove(i)
i = nextOrder
}
}