dede建设网站,网页设计师的发展路径,音乐网站的音乐怎么做音乐试听,点击器设计模式-控制反转【golang】 听不懂的概念
将程序中对象的创建、依赖管理的控制权#xff0c;从代码内部转移到外部容器/框架
获取mysql数据#xff0c;存入redis package mrimport (fmtlogostesting
)type Database int…设计模式-控制反转【golang】听不懂的概念将程序中对象的创建、依赖管理的控制权从代码内部转移到外部容器/框架获取mysql数据存入redispackagemrimport(fmtlogostesting)typeDatabaseinterface{Query(sqlstring)string}typeCacheinterface{Set(key,valuestring)}// Mysql操作typeMySQLDatabasestruct{}func(db*MySQLDatabase)Query(sqlstring)string{returnfmt.Sprintf(MySQL result: %s,sql)}// Pg操作typePgDatabasestruct{}func(db*PgDatabase)Query(sqlstring)string{returnfmt.Sprintf(PgSQL result: %s,sql)}// Redis操作typeRedisCachestruct{}func(c*RedisCache)Set(key,valuestring){fmt.Printf(Redis set: %s %s\n,key,value)}// 业务逻辑funcTestManual(t*testing.T){db:MySQLDatabase{}cache:RedisCache{}// 下面为业务逻辑代码user:db.Query(SELECT * FROM users WHERE id1)cache.Set(user:1,user)// ………………}定义好了查询 mysql、设置 redis 的方法TestManual需要做的事情是查询 mysql 的值存入 redis这时TestManual方法需要依赖两个依赖DatabaseCache当我的业务逻辑代码不变需要更换一下两个依赖时例如我要把mysql切换成PostgreSql时那只能修改我的业务逻辑方法了例如// 业务逻辑funcTestManual(t*testing.T){// db : MySQLDatabase{}db:PgSQLDatabase{}cache:RedisCache{}// 下面为业务逻辑代码user:db.Query(SELECT * FROM users WHERE id1)cache.Set(user:1,user)// ………………}所以我需要把依赖的这部分代码提出来以后换库还是什么的不去动我的业务逻辑方法-TestManual换一种写法添加一个RunUserService叫做管理容器也好方法也好总之是一块儿代码封装packagemrimport(fmtlogostesting)typeDatabaseinterface{Query(sqlstring)string}typeCacheinterface{Set(key,valuestring)}// Mysql操作typeMySQLDatabasestruct{}func(db*MySQLDatabase)Query(sqlstring)string{returnfmt.Sprintf(MySQL result: %s,sql)}// Pg操作typePgSqlDatabasestruct{}func(db*PgSqlDatabase)Query(sqlstring)string{returnfmt.Sprintf(PgSQL result: %s,sql)}// Redis操作typeRedisCachestruct{}func(c*RedisCache)Set(key,valuestring){fmt.Printf(Redis set: %s %s\n,key,value)}// 数据服务操作函数typeDataServiceHandlerfunc(db Database,cache Cache)funcRunUserService(handler DataServiceHandler){// 依赖代码迁移到这里db:MySQLDatabase{}// db : PgSqlDatabase{}cache:RedisCache{}handler(db,cache)}// 业务逻辑funcTestManual(t*testing.T){RunUserService(func(db Database,cache Cache){// 下面为业务逻辑代码user:db.Query(SELECT * FROM users WHERE id1)cache.Set(user:1,user)})}这种体现形式为 闭包回调函数interface 的组合方式我认为其本质还是回调函数通过传递一段预定义代码块在真正执行业务代码时调用栈返回去执行结果再回到调用方这里从而简化调用方的代码量更多的关于依赖注入、控制反转的实现参考 https://blog.csdn.net/qq_37485347/article/details/142203484