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.mzph.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;之后实战课程也将会逐步更新。 若…