github:https://github.com/zhumengyifang/GolangDesignPatterns
上一篇:https://blog.csdn.net/weixin_40165163/article/details/91128083
在策略模式中,一个类的行为或其他算法可以在运行时更改。这种类型的设计模式属于行为型模式。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的context对象。策略对象改变context对象的执行算法。
意图:定义一系列的算法,把他们一个个封装起来,并且使它们可互相替换。
主要解决:在有多种算法相似的情况下,使用if else所带来的复杂和难以维护。
何时使用:一个系统有许多许多类,而区分他们的只是他们直接的行为
如何解决:将这些算法封装成一个一个的类,任意的替换。
关键代码:实现同一个接口。
优点:算法可以自由切换、避免使用多重条件判断条件、扩展性好
缺点:策略类会增多、所有策略类都需要对外暴露
使用场景:
注意事项:如果一个系统的策略多于四个,就要考虑使用混合模式,解决策略膨胀的问题。
我们将创建一个定义活动的 Strategy 接口和实现了 Strategy 接口的实体策略类。Context 是一个使用了某种策略的类。
StrategyPatternDemo,我们的演示类使用 Context 和策略对象来演示 Context 在它所配置或使用的策略改变时的行为变化。
代码:
package StrategyPattern
type Strategy interface {
DoOperation(num1 int, num2 int) int
}
type OperationAdd struct {
}
func (o *OperationAdd) DoOperation(num1 int, num2 int) int {
return num1 + num2
}
type OperationSubstract struct {
}
func (o *OperationSubstract) DoOperation(num1 int, num2 int) int {
return num1 - num2
}
type OperationMultiply struct {
}
func (o *OperationMultiply) DoOperation(num1 int, num2 int) int {
return num1 * num2
}
package StrategyPattern
type Context struct {
strategy Strategy
}
func (c *Context) Context(strategy Strategy) *Context {
c.strategy = strategy
return c
}
func (c *Context) ExecuteStrategy(num1 int, num2 int) int {
return c.strategy.DoOperation(num1, num2)
}
测试:
func testStrategyPattern() {
context := new(StrategyPattern.Context).Context(new(StrategyPattern.OperationAdd))
fmt.Println("10+5:", context.ExecuteStrategy(10, 5))
context.Context(new(StrategyPattern.OperationSubstract))
fmt.Println("10-5:", context.ExecuteStrategy(10, 5))
context.Context(new(StrategyPattern.OperationMultiply))
fmt.Println("10*5:", context.ExecuteStrategy(10, 5))
}
输出:
10+5: 15
10-5: 5
10*5: 50
下一篇:https://blog.csdn.net/weixin_40165163/article/details/91128627