golang架构设计开闭原则手写实现
缘起
开闭原则
场景
思路
ICourse.go
GolangCourse.go
IDiscount.go
DiscountedGolangCourse.go
open_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.goprinciples/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架构设计开闭原则的资料请关注易知道(ezd.cc)其它相关文章!
相关内容
-
golang代理怎么设置
golang代理怎么设置,代理,请求,设置,语言,客户端,应用程序,Go语言(或...
-
什么是golang
什么是golang,语言,执行,编程语言,机器语言,高级语言,运行,golang是...
-
用golang chromedp 操作已经打开的chrome浏览器
用golang chromedp 操作已经打开的chrome浏览器,代码,命令,win...
-
Golang之wait.Until 简单测试用例
Golang之wait.Until 简单测试用例,结束,主程序,测试目的,验证wa...
-
使用Golang实现简单Ping过程
使用Golang实现简单Ping过程,报文,字节,摘要: Ping的基本原理...
-
golang二进制读写文件-二进制文件
golang二进制读写文件-二进制文件有些时候,我突然想知道MySQL...
-
Golang Web学习(15)——文件上传-上传文件
Golang Web学习(15)——文件上传-上传文件介绍在web开发中,对于...
-
Golang开发的全功能单文件Web服务器-文件服务器
Golang开发的全功能单文件Web服务器-文件服务器最新HTTP/2标...
-
GoLang下载安装-bin文件安装
GoLang下载安装-bin文件安装GoLang IDEA https://www.jetbra...
-
Go Web 框架 Gin 实践 1—Golang 介绍与 Gin 环
Go Web 框架 Gin 实践 1—Golang 介绍与 Gin 环境安装-bin文...
-
Golang 学习笔记(08)——文件操作-bin文件格式
Golang 学习笔记(08)——文件操作-bin文件格式path在path包中...
-
Golang gRPC HTTP协议转换示例
Golang gRPC HTTP协议转换示例gRPC HTTP协议转换
正当有这... -
golang高并发系统限流策略漏桶和令牌桶算法源码
golang高并发系统限流策略漏桶和令牌桶算法源码剖析目录前言...
-
Golang泛型的使用方法详解
Golang泛型的使用方法详解目录1. 泛型是什么2. 泛型的简单使...
-
golang 对象深拷贝的常见方式及性能
golang 对象深拷贝的常见方式及性能目录关于golang拷贝的概...