golang 架構設計原則 依賴倒置原則
緣起
最近復習設計模式
拜讀譚勇德的<>
該書以java語言演繹了常見設計模式
本系列筆記擬采用golang練習之
依賴倒置原則依賴倒置原則(Dependence Inversion Principle, DIP)指設計代碼結構時,高層模塊不應該依賴底層模塊,二者都應該依賴其抽象。
抽象不應該依賴細節,細節應該依賴抽象。
常見的依賴注入方式有: 方法參數注入, 構造器參數注入, setter方法注入
_
場景線上學校有一系列課程
用戶可選擇若干門課程進行學習
如果把學習課程的過程直接實現為用戶的方法, 則每增加一門課程, 就需要增加一個學習方法
根據依賴倒置原則, 可以把學習過程抽象為學習接口, 由不同的課程實例各自實現
BadUser.go
BadUser以不同方法實現各種課程的學習過程, 課程的增加導致BadUser代碼越來越臃腫package dependence_inversion
import "fmt"
type BadUser struct {
iID int
sName string
}
func NewBadUser(id int, name string) *BadUser {
return &BadUser{
iID: id,
sName: name,
}
}
func (me *BadUser) StudyJavaCourse() {
fmt.Printf("%v is learning %v\n", me.sName, "java")
}
func (me *BadUser) StudyGolangCourse() {
fmt.Printf("%v is learning %v\n", me.sName, "golang")
}
GoodUser.go
GoodUser通過實現IUser接口提供用戶基本信息, 并把不同課程的學習過程, 委托給ICourse接口去實現package dependence_inversion
type IUser interface {
ID() int
Name() string
Study(ICourse)
}
type GoodUser struct {
iID int
sName string
}
func NewGoodUser(id int, name string) IUser {
return &GoodUser{
iID: id,
sName: name,
}
}
func (me *GoodUser) ID() int {
return me.iID
}
func (me *GoodUser) Name() string {
return me.sName
}
func (me *GoodUser) Study(course ICourse) {
course.SetUser(me)
course.Study()
}
GolangCourse.go
通過setter方法注入IUser, ICourse接口封裝了具體課程的學習過程package dependence_inversion
import "fmt"
type ICourse interface {
ID() int
Name() string
SetUser(IUser)
Study()
}
type GolangCourse struct {
iID int
sName string
xCurrentUser IUser
}
func NewGolangCourse() ICourse {
return &GolangCourse{
iID: 11,
sName: "golang",
xCurrentUser: nil,
}
}
func (me *GolangCourse) ID() int {
return me.iID
}
func (me *GolangCourse) Name() string {
return me.sName
}
func (me *GolangCourse) SetUser(user IUser) {
me.xCurrentUser = user
}
func (me *GolangCourse) Study() {
fmt.Printf("%v is learning %v\n", me.xCurrentUser.Name(), me.Name())
}
dependence_inversion_test.go
測試用例package main
import "testing"
import (
dip "learning/gooop/principles/dependence_inversion"
)
func TestDIP(t *testing.T) {
bu := dip.NewBadUser(1, "Tom")
bu.StudyGolangCourse()
gu := dip.NewGoodUser(2, "Mike")
gu.Study(dip.NewGolangCourse())
}
測試輸出$ go test -v main/dependence_inversion_test.go
=== RUN TestDIP
Tom is learning golang
Mike is learning golang
--- PASS: TestDIP (0.00s)
PASS
ok command-line-arguments 0.002s
有疑問加站長微信聯系(非本文作者)