github:https://github.com/zhumengyifang/GolangDesignPatterns
上一篇责任链设计模式:https://blog.csdn.net/weixin_40165163/article/details/90814115
命令模式
命令模式是一种数据驱动的设计模式,它属于行为模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的何时的对象,并把该命令传给相应的对象,该对象执行命令。
介绍:
意图:将一个请求封装成一个对象,从而使得您可以用不同的请求对客户进行参数化。
主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合关系,但某些场合,比如需要对行为进行记录、撤销或重做、事物等处理时,这种无法抵御变化的紧耦合的设计就不太合适。
如何解决:通过调用者调用接受者执行命令,顺序:调用者➡️接收者➡️命令。
优点:降低了系统的耦合度、新的命令可以很容易添加到系统中去
缺点:使用命令模式可能会导致某些系统有过多的具体命令类。
使用场景:认为是命令的地方都可以使用命令模式。
实现
我们首先创建作为命令的接口Order,然后创建作为请求的Stock类。实体命令类BuyStock和SellStock,实现了Order接口,将执行实际的命令处理。创建作为调用对象的类Broker,它接受订单并能下订单。
Broker对象使用命令模式,基于命令的类型确定哪个对象执行哪个命令。CommandPatternDemo,我们的演示类使用Broker类来演示命令模式。
代码:
package CommandPattern
type Order interface {
Execute()
}
type BuyStock struct {
abcStock *Stock
}
func (b *BuyStock) BuyStock(abcStock *Stock) {
b.abcStock = abcStock
}
func (b *BuyStock) Execute() {
b.abcStock.Buy()
}
type SellStock struct {
abcStock *Stock
}
func (s *SellStock) SellStock(abcStock *Stock) {
s.abcStock = abcStock
}
func (s *SellStock) Execute() {
s.abcStock.Sell()
}
package CommandPattern
import "fmt"
type Stock struct {
Name string
Quantity int
}
func NewStock() *Stock {
stock := new(Stock)
stock.Name = "ABC"
stock.Quantity = 10
return stock
}
func (s *Stock) Buy() {
fmt.Println("Stock [ Name: ", s.Name, ", Quantity: ", s.Quantity, " ] bought")
}
func (s *Stock) Sell() {
fmt.Println("Stock [ Name: ", s.Name, ",Quantity: ", s.Quantity, " ] sold")
}
package CommandPattern
type Broker struct {
orders []Order
}
func (b *Broker) TakeOrder(order Order) {
b.orders = append(b.orders, order)
}
func (b *Broker) PlaceOrders() {
for _, order := range b.orders {
order.Execute()
}
}
测试:
func testCommandPattern() {
abcStock := CommandPattern.NewStock()
buyStockOrder := new(CommandPattern.BuyStock)
buyStockOrder.BuyStock(abcStock)
sellStockOrder := new(CommandPattern.SellStock)
sellStockOrder.SellStock(abcStock)
broker := new(CommandPattern.Broker)
broker.TakeOrder(buyStockOrder)
broker.TakeOrder(sellStockOrder)
broker.PlaceOrders()
}
输出:
Standard Console::Logger: This is an information.
File::Logger: This is a debug level information.
Error Console::Logger: This is an error information.
下一篇解析器模式:https://blog.csdn.net/weixin_40165163/article/details/90815146