golang架构设计开闭原则手写实现
更新时间:2022-08-09 08:32:50 作者:佚名 我要评论(0)
目录缘起开闭原则场景思路ICourse.goGolangCourse.goIDiscount.goDiscountedGolangCourse.goopen_close_test.go测试缘起
最近复习设计模式
拜
最近复习设计模式
拜
缘起
最近复习设计模式
拜读谭勇德的<<设计模式就该这样学>>
该书以java语言演绎了常见设计模式
本系列笔记拟采用golang练习之
开闭原则
- 开闭原则(Open-Closed Principle, OCP)指一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。所谓开闭,也正是对扩展和修改两个行为的一个原则。
- 实现开闭原则的核心思想就是面向抽象编程。
场景
- 某线上学习平台, 提供系列课程产品(接口: ICourse)
- 每个课程有id,name,price等属性
- 现在平台搞促销, golang课程(GolangCourse)打六折
- 如何上架打折课程? 是直接修改原golang课程的价格, 还是增加折后golang课程?
思路
- 开闭原则, 就是尽量避免修改, 改以扩展的方式, 实现系统功能的增加
- 增加"优惠折扣"接口 - IDiscount
- 增加"折后golang课程" - DiscountedGolangCourse, 同时实现课程接口和折扣接口
- DiscountedGolangCourse继承自GolangCourse, 添加实现折扣接口, 并覆盖ICourse.price()方法
ICourse.go
principles/open_close/ICourse.go
课程接口
package open_close type ICourse interface { ID() int Name() string Price() float64 }
GolangCourse.go
principles/open_close/GolangCourse.go
golang课程类, 实现ICourse接口
package open_close type GolangCourse struct { iID int sName string fPrice float64 } func NewGolangCourse(id int, name string, price float64) ICourse { return &GolangCourse{ iID: id, sName: name, fPrice: price, } } func (me *GolangCourse) ID() int { return me.iID } func (me *GolangCourse) Name() string { return me.sName } func (me *GolangCourse) Price() float64 { return me.fPrice }
IDiscount.go
principles/open_close/IDiscount.go
折扣接口
package open_close type IDiscount interface { Discount() float64 }
DiscountedGolangCourse.go
principles/open_close/DiscountedGolangCourse.go
该课程同时实现ICourse和IDiscount接口
package open_close type DiscountedGolangCourse struct { GolangCourse fDiscount float64 } func NewDiscountedGolangCourse(id int, name string, price float64, discount float64) ICourse { return &DiscountedGolangCourse{ GolangCourse: GolangCourse{ iID: id, sName: name, fPrice: price, }, fDiscount : discount, } } // implements IDiscount.Discount func (me *DiscountedGolangCourse) Discount() float64 { return me.fDiscount } // overwrite ICourse.Price func (me *DiscountedGolangCourse) Price() float64 { return me.fDiscount * me.GolangCourse.Price() }
open_close_test.go
main/open_close_test.go
课程接口测试用例
package main import ( "testing" ) import (ocp "learning/gooop/principles/open_close") func Test_open_close(t *testing.T) { fnShowCourse := func(it ocp.ICourse) { t.Logf("id=%v, name=%v, price=%v\n", it.ID(), it.Name(), it.Price()) } c1 := ocp.NewGolangCourse(1, "golang课程", 100) fnShowCourse(c1) c2 := ocp.NewDiscountedGolangCourse(2, "golang优惠课程", 100, 0.6) fnShowCourse(c2) }
测试
$> go test -v main/open_close_test.go === RUN Test_open_close open_close_test.go:10: id=1, name=golang课程, price=100 open_close_test.go:10: id=2, name=golang优惠课程, price=60 --- PASS: Test_open_close (0.00s) PASS ok command-line-arguments 0.001s
以上就是golang架构设计开闭原则手写实现的详细内容,更多关于golang架构设计开闭原则的资料请关注脚本之家其它相关文章!
您可能感兴趣的文章:
- golang实现ftp实时传输文件的案例
- golang http 连接超时和传输超时的例子
- Golang栈结构和后缀表达式实现计算器示例
- golang?四则运算计算器yacc归约手写实现
- golang 随机数的两种方式
- Golang切片删除指定元素的三种方法对比
- Golang 实现 RTP音视频传输示例详解
您可能感兴趣的文章:
相关文章
python接口自动化使用requests库发送http请求
目录前言一、requests库二、HTTP 请求方法三、发送GET请求四、发送POST请求五、获取响应数据六、高级操作6.1文件下载6.2文件上传6.3SSL证书验2022-08-09Python使用Rich?type和TinyDB构建联系人通讯录
目录引言工具准备通讯录特征如何创建联系人模型如何使用TinyDB创建数据库如何使用typer创建命令行如何使用Rich设计终端如何使用打字命令连接2022-08-09SpringBoot整合SpringSession实现分布式登录详情
目录Session 共享为什么服务器 A 登录后,请求发到服务器 B,不认识该用户?解决方案SpringBoot整合SpringSession实现分布式登录Session 共享2022-08-09
最新评论