-
3.3 策略模式
-
代码实现
来个 🌰,我们在保存文件的时候,由于政策或者其他的原因可能需要选择不同的存储方式,敏感数据我们需要加密存储,不敏感的数据我们可以直接明文保存。
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 }
- 留下你的读书笔记
- 你还没登录,点击这里
-
用户笔记留言