Go设计模式15-策略模式
序
- Go 设计模式实现,包含常见的设计模式实现,同时这也是 极客时间-设计模式之美 的笔记,源课程采用 Java 实现,本系列会采用 Go 实现
- 课程: 60 | 策略模式(上):如何避免冗长的 if-else/switch 分支判断代码?
- 本文代码仓库: https://github.com/mohuishou/go-design-pattern 🌟🌟🌟🌟🌟
- RoadMap: 15/22 持续更新中,预计一周更新 2 ~ 3 种设计模式,预计到 202010 月底前更新完成
- 获取更新: Github、知乎、RSS、开发者头条**
笔记
代码实现
来个 🌰,我们在保存文件的时候,由于政策或者其他的原因可能需要选择不同的存储方式,敏感数据我们需要加密存储,不敏感的数据我们可以直接明文保存。
Code
package strategy
import (
"fmt"
"io/ioutil"
"os"
)
// StorageStrategy 存储策略
type StorageStrategy interface {
Save(name string, data []byte) error
}
var strategys = map[string]StorageStrategy{
"file": &fileStorage{},
"encrypt_file": &encryptFileStorage{},
}
// NewStorageStrategy NewStorageStrategy
func NewStorageStrategy(t string) (StorageStrategy, error) {
s, ok := strategys[t]
if !ok {
return nil, fmt.Errorf("not found StorageStrategy: %s", t)
}
return s, nil
}
// FileStorage 保存到文件
type fileStorage struct{}
// Save Save
func (s *fileStorage) Save(name string, data []byte) error {
return ioutil.WriteFile(name, data, os.ModeAppend)
}
// encryptFileStorage 加密保存到文件
type encryptFileStorage struct{}
// Save Save
func (s *encryptFileStorage) Save(name string, data []byte) error {
// 加密
data, err := encrypt(data)
if err != nil {
return err
}
return ioutil.WriteFile(name, data, os.ModeAppend)
}
func encrypt(data []byte) ([]byte, error) {
// 这里实现加密算法
return data, nil
}
单元测试
package strategy
import (
"testing"
"github.com/stretchr/testify/assert"
)
func Test_demo(t *testing.T) {
// 假设这里获取数据,以及数据是否敏感
data, sensitive := getData()
strategyType := "file"
if sensitive {
strategyType = "encrypt_file"
}
storage, err := NewStorageStrategy(strategyType)
assert.NoError(t, err)
assert.NoError(t, storage.Save("./test.txt", data))
}
// getData 获取数据的方法
// 返回数据,以及数据是否敏感
func getData() ([]byte, bool) {
return []byte("test data"), false
}
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!