以嵌入組合的方式實現(xiàn)控制反轉(zhuǎn) IoC:
控制反轉(zhuǎn)
是一種解耦思想,將原本耦合在業(yè)務(wù)邏輯
中的控制邏輯
單獨拆出來實現(xiàn),不再讓業(yè)務(wù)邏輯
在處理業(yè)務(wù)的同時還要去實現(xiàn)控制邏輯
,而是專注處理業(yè)務(wù)。在業(yè)務(wù)邏輯
代碼中耦合進(jìn)控制邏輯
,會導(dǎo)致在編寫業(yè)務(wù)邏輯時需要處理業(yè)務(wù)之外的事,而且控制邏輯
耦合進(jìn)業(yè)務(wù)中,只適用于當(dāng)前業(yè)務(wù)邏輯,無法被復(fù)用
。文章來源地址http://www.zghlxwxcb.cn/news/detail-838795.html
// 以嵌入組合的方式實現(xiàn)控制反轉(zhuǎn) IoC
package main
import (
"errors"
"fmt"
)
// 2.被要求:新增一 'undo 后悔' 功能。
// 3.解決辦法:定義單獨(通用的)控制邏輯,別的數(shù)據(jù)結(jié)構(gòu)也可能會用到
// 即:控制邏輯封裝在 Undo 中,業(yè)務(wù)邏輯 IntSet 只關(guān)心處理整型數(shù)據(jù)
type Undo []func() // 函數(shù)切片
func (undo *Undo) Add(fn func()) { //undo入棧
*undo = append(*undo, fn)
}
func (undo *Undo) Undo() error {
functions := *undo
if len(functions) == 0 {
return errors.New("No functions to undo")
}
index := len(functions) - 1
if fn := functions[index]; fn != nil {
fn()
functions[index] = nil // 垃圾回收
}
*undo = functions[:index] // undo出棧操作
return nil
}
// ----------------------------------------------
type IntSet struct {
data map[int]bool // 1.原本的處理整形數(shù)據(jù)的結(jié)構(gòu)
undo Undo // 3.解決辦法:并在此處嵌入一個 Undo 結(jié)構(gòu),間接實現(xiàn) undo 功能
}
func NewIntSet() IntSet {
return IntSet{data: make(map[int]bool)}
}
func (set *IntSet) Add(x int) {
// set.data[x] = true //原來邏輯
// 改為
if !set.Contains(x) {
set.data[x] = true
set.undo.Add(func() { set.Delete(x) })
} else {
set.undo.Add(nil)
}
}
func (set *IntSet) Delete(x int) {
// delete(set.data, x) //原來邏輯
//改為
if set.Contains(x) {
delete(set.data, x)
set.undo.Add(func() { set.Add(x) })
} else {
set.undo.Add(nil)
}
}
func (set *IntSet) Contains(x int) bool {
return set.data[x]
}
// 3.新增
func (set *IntSet) Undo() error {
return set.undo.Undo()
}
// ----------------------------------------------
func main() {
a := NewIntSet()
for i := 1; i < 11; i++ {
a.Add(i)
}
fmt.Printf("%v\n", a) //map[1:true 2:true 3:true 4:true 5:true 6:true 7:true 8:true 9:true 10:true]
fmt.Printf("%v\n", a.Contains(2))
a.Delete(2)
fmt.Printf("%v\n", a) //map[1:true 3:true 4:true 5:true 6:true 7:true 8:true 9:true 10:true]
fmt.Printf("%v\n", a.Contains(2))
a.Undo()
fmt.Printf("%v\n", a) //map[1:true 2:true 3:true 4:true 5:true 6:true 7:true 8:true 9:true 10:true]
fmt.Printf("%v\n", a.Contains(2))
fmt.Printf("%v\n", a.Contains(4))
a.Delete(4)
fmt.Printf("%v\n", a) //map[1:true 2:true 3:true 5:true 6:true 7:true 8:true 9:true 10:true]
fmt.Printf("%v\n", a.Contains(4))
a.Delete(7)
fmt.Printf("%v\n", a) //map[1:true 2:true 3:true 5:true 6:true 8:true 9:true 10:true]
fmt.Printf("%v\n", a.Contains(7))
a.Undo()
fmt.Printf("%v\n", a) //map[1:true 2:true 3:true 5:true 6:true 7:true 8:true 9:true 10:true]
fmt.Printf("%v\n", a.Contains(7))
a.Undo()
fmt.Printf("%v\n", a) //map[1:true 2:true 3:true 4:true 5:true 6:true 7:true 8:true 9:true 10:true]
fmt.Printf("%v\n", a.Contains(4))
}
文章來源:http://www.zghlxwxcb.cn/news/detail-838795.html
到了這里,關(guān)于Go中的控制反轉(zhuǎn) IoC的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!