Golang策略模式(二十二)

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 在它所配置或使用的策略改变时的行为变化。

Golang策略模式(二十二)_第1张图片

代码:

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

你可能感兴趣的:(golang,设计模式,Golang)