php 依賴倒置原則,手擼golang 架構設計原則 依賴倒置原則

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

有疑問加站長微信聯系(非本文作者)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287270.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287270.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287270.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

看聊天記錄都學不會C語言?太菜了吧》(16)我一直以為校花很漂亮,直到我叫了她一聲...

若是大一學子或者是真心想學習剛入門的小伙伴可以私聊我&#xff0c;若你是真心學習可以送你書籍&#xff0c;指導你學習&#xff0c;給予你目標方向的學習路線&#xff0c;無套路&#xff0c;博客為證。 本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋…

小米空調來了,意外的是還一起來了一個馬桶蓋

8月10日下午&#xff0c;小米旗下生態鏈企業智米召開了新品發布會&#xff0c;發布會上正式推出了智米全直流變頻空調和智米智能馬桶蓋。 智米全直流變頻空調采用了純白配色&#xff0c;外觀設計較為簡潔&#xff0c;空調底部有一個圓形的顯示屏&#xff0c;可顯示溫度、電量統…

聊一聊 CLR 中的 typedef 是怎么玩的

一&#xff1a;背景 在 CLR 源碼中&#xff0c;我們會看到很多關于 typedef 的定義&#xff0c;比如下面這樣&#xff1a;// Callback function type used by DacStreamManager to coordinate // amount of available memory between multiple streamable data // structures (…

JAVA如何正確處理Unicode字符

最近在開發輸入法程序時遇到一個小問題&#xff0c;就是刪除一個emoji時&#xff0c;不能一次刪干凈&#xff0c;需要執行兩次操作才可以。Intuitively&#xff0c;這肯定是java操作unicode字符的問題&#xff0c;于是找了JAVA官方文檔參考一下&#xff0c;解決了這個問題&…

透過面試題,洞察Hbase 核心知識點

LSM 算法 HFile 索引 &#xff0c;二級索引 hbase的問題 1.hbase怎么預分區&#xff1f; 2.hbase怎么給web前臺提供接口來訪問&#xff1f; 3.htable API有沒有線程安全問題&#xff0c;在程序中是單例還是多例&#xff1f; 4.我們的hbase大概在公司業務中&#xff08;主要…

Android之解決android9.0通過Inten方式卸載APP沒反應

1 問題 通過Intent卸載APP在安卓9.0手機上沒反應&#xff0c;也沒報錯&#xff0c;卸載相關APP跳轉到卸載頁面代碼 fun unInstallApp(packageName: String) {val uri: Uri Uri.fromParts("package", packageName, null)val intent Intent(Intent.ACTION_DELETE, u…

《看聊天記錄都學不會Python到游戲實戰?太菜了吧》(4)小白不知道這個知識點將會錯漏百出

本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋了新手在學習中的一般問題。此系列將會持續更新&#xff0c;包括別的語言以及實戰都將使用對話的方式進行教學&#xff0c;基礎編程語言教學適用于零基礎小白&#xff0c;之后實戰課程也將會逐步更新。 若…

【Pix4d精品教程】打開Pix4DMapper時提示Pix4DMapper.exe已停止工作的完全解決辦法

本文為作者在使用軟件時,打開Pix4DMapper時提示Pix4DMapper.exe已停止工作的完全解決辦法,親測可用! 目錄 一、問題錯誤提示 二、問題分析及解決方法 一、問題錯誤提示 打開Pix4DMapper時,提示Pix4DMapper.exe已停止工作,錯誤提示如下: 展開問題詳細信息:

oracle 導庫時日志滿了,oracle rac 11g 日志占滿系統盤導致數據庫down掉

oracle日志占滿系統盤滿了導致數據庫掛掉 并且archivelog日志也滿了倒是數據庫無法open&#xff0c;無法登陸&#xff0c;幸好還可以到mount狀態。解決辦法&#xff1a;1.根據報錯查看 表象&#xff1a; crs 服務down掉CRS-0184: Cannot communicate with the CRS daemon刪除/v…

Framework Design Studio 發布了

介紹 Krzysztof Cwalina 和他的伙計們最近在開發一個工具&#xff0c;可以幫助框架設計者更容易地進行設計、復查和維護高度易用的API&#xff0c;你可一定要看看Framework Design Studio&#xff08;FDS&#xff09;。 可以在此處下載FDS和它的快速入門文檔。 目前這個工具主要…

微服務 配置中心 Nacos .Net 5

本文來自投稿&#xff1a;藍創精英團隊基于Nacos來一篇關于微服務的配置中心方案Demo。Nacos是開源的&#xff0c;同時&#xff0c;阿里云也有收費的關于它的服務&#xff0c;公司剛好是依托阿里云的服務體系&#xff0c;所以&#xff0c;使用它作為配置中心的可能性還是很大的…

【Pix4d精品教程】安裝Pix4Dmapper時提示“無法啟動此程序,因為計算機中丟失api-ms-win-crt-runtime-l1-1-0.dll”完全解決辦法

Pix4Dmapper系列文章合集: 打開Pix4DMapper時提示Pix4DMapper.exe已停止工作的完全解決辦法 Pix4DMapper圖文安裝教程(附安裝包下載) Pix4Dmapper完整航測內業操作流程手把手圖文教程 目 錄 一、問題描述 二、問題分析 三、解決辦法

看聊天記錄都學不會C語言?太菜了吧》(17)5分鐘搞懂指針與多重指針

若是大一學子或者是真心想學習剛入門的小伙伴可以私聊我&#xff0c;若你是真心學習可以送你書籍&#xff0c;指導你學習&#xff0c;給予你目標方向的學習路線&#xff0c;無套路&#xff0c;博客為證。 本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋…

如何保護你的linux操作系統

導讀在現在這個世道中&#xff0c;Linux操作系統的安全是十分重要的。但是&#xff0c;你得知道怎么干。一個簡單反惡意程序軟件是遠遠不夠的&#xff0c;你需要采取其它措施來協同工作。那么試試下面這些手段吧。 使用SELinuxSELinux是用來對Linux進行安全加固的&#xff0c;有…

Android之使用ACTION_USAGE_ACCESS_SETTINGS權限檢測手機多少天沒有未使用其它APP

1 需求 找出手機多少天沒有使用的所有APP 2 思路 通過 ACTION_USAGE_ACCESS_SETTINGS權限得到多少天已經使用的APP的包名,然后獲取手機所有用戶APP,剩下的APP就是多少天沒有使用的APP。 3 ACTION_USAGE_ACCESS_SETTINGS權限申請 1)在AndroidManifest.xml文件里面定義權限…

無人職守安裝的設計與部署

無人職守安裝的設計與部署 (2009-2-19) 安裝前需要生成一個應答文件&#xff0c;此時需要一個光盤中的工具。首先&#xff0c;將WINDOWN2003光盤載入CD&#xff0c;---單擊退出。接下來打開光盤&#xff0c; 選擇SUPPORT—并打開&#xff0c; --TOOLS –并打開 -----…

【Pix4d精品教程】Pix4dmapper航測內業項目化數據處理完整流程(空三、生成點云、DOM和DSM)

Pix4dmapper是一款集全自動、快速、專業精度為一體的無人機數據和航空影像數據處理軟件。無需專業知識,無需人工干預,即可將數千張影像快速制作成專業的、精確的二維地圖和三維模型。 本文講解采用Pix4dmapper攝影測量內業數據處理完整流程,主要步驟包括:新建項目、添加影像…

干掉RedisHelper,請這樣用分布式緩存

前言我們在項目中使用Redis時通常是寫一個單例模式的RedisHelper靜態類&#xff0c;暴露一些常用的Get、Set等操作&#xff0c;在需要使用地方直接RedisHelper.StringGet(xx,xx)就可以了&#xff0c;這樣雖然簡單粗暴地滿足我們對Redis的所有操作需要&#xff0c;但是這在Asp.N…

4個常用的awk統計命令

1、求和cat data|awk {sum$1} END {print "Sum ", sum}2、求平均cat data|awk {sum$1} END {print "Average ", sum/NR}3、求最大值cat data|awk BEGIN {max 0} {if ($1>max) max$1 fi} END {print "Max", max}4、求最小值&#xff08;min…

《看聊天記錄都學不會C#?太菜了吧》(2)C#那么簡單我為何之前還學C語言?

本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋了新手在學習中的一般問題。此系列將會持續更新&#xff0c;包括別的語言以及實戰都將使用對話的方式進行教學&#xff0c;基礎編程語言教學適用于零基礎小白&#xff0c;之后實戰課程也將會逐步更新。 若…