Golang命令设计模式(十四) - Go语言中文社区

Golang命令设计模式(十四)


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

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_40165163/article/details/90814345
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-02-13 12:15:57
  • 阅读 ( 1117 )
  • 分类:设计模式

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢