上篇文章在谈到优化代码的时候,有一部分涉及到了使用策略模式优化我们的代码,本篇文章将围绕策略模式谈谈自己的思考~
总的来说,设计模式是对软件设计中普遍存在并且反复出现的各种问题,所提出的通用解决方案,是一系列编码经验的集合。
那么什么是策略模式呢?它是定义一个算法的系列,将其各个分装,并且使他们有交互性。策略模式使得算法在用户使用的时候能独立的改变。如下图所示
在软件编码中,实现策略模式需要我们定义各种策略类,但是在 go 中我们可以使用 map 来避免这一缺点,直接定义需要实现的策略方法即可。
一般情况下我们都是这样做,采用 if/else
来做我们的策略选择,然而当业务逻辑越来越复杂的时候,代码就会变得很臃肿,难以维护,比如这样的
if condition :
// doSomething
else if condition:
// doOtherthing
else if
// doAnOtherThing
else
// doAlotOfthing
策略模式的精髓是封装一组算法实现以供使用时的调度,golang
里面有一个很重要的语法糖就是 func()
方法变量,因此,在 golang
中实现类似策略模式的做法,不需要依赖于对象而进行,比如
package main
import (
"fmt"
)
var Strategy map[string]func(v ...interface{})
func init(){
Strategy := make(map[string]func(v ...interface{}))
Strategy["add"] = func(a int,b int) {
fmt.Println("a + b")
}
Strategy["reduce"] = func(a int,b int) {
fmt.Println("a - b")
}
Strategy["multiply"] = func(a int,b int) {
fmt.Println("a*b")
}
Strategy["divide"] = func(a int,b int) {
fmt.Println("a/b")
}
}
func main(){
Strategy["insert"]()
}
策略模式的核心是封装一组算法实现特别是相似的算法实现,所以我们可以通过 map 来进行 KV 的约束,key 是客户端传进来的对应策略,用具体的算法实现 fun() 作为 value,这样无论是算法的封装还是调度都从业务场景中解耦了。
当然,缺点就是如果需要扩展策略,就要到增加一个 Entry<K,V>,没有传统的实现方式中直接扩展一个实现了策略接口的对象那么方便,这两个还得看具体的项目取舍,一句老话,没有好坏,只有合适不合适,好的软件实现都是考虑到各种情况的折中。
作 者:haifeiWu 原文链接:https://www.hchstudio.cn/article/2020/4a72/ 版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。