您现在的位置是:群英 > 开发技术 > 编程语言
Golang架构设计开闭原则是什么,怎样实现
Admin发表于 2022-09-30 17:59:22476 次浏览
今天这篇给大家分享的知识是“Golang架构设计开闭原则是什么,怎样实现”,小编觉得挺不错的,对大家学习或是工作可能会有所帮助,因此分享发大家做个参考,下文的讲解详细,步骤过程清晰,希望这篇“Golang架构设计开闭原则是什么,怎样实现”文章能帮助大家解决问题。

缘起

最近复习设计模式

拜读谭勇德的<<设计模式就该这样学>>

该书以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架构设计开闭原则是什么,怎样实现”的相关知识,感谢各位的阅读,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注群英网络,小编每天都会为大家更新不同的知识。

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

标签: golang架构设计
相关信息推荐
2021-11-02 17:18:09 
摘要:这篇文章给大家分享的是PHP中array_map()函数的内容。小编觉得挺实用的,因此分享给大家做个参考,下面将介绍array_map()函数的说明、语法、参数、返回值、实例这些,文中示例代码介绍的非常详细,感兴趣的朋友接下来一起跟随小编看看吧。
2022-06-18 17:02:37 
摘要:又到了一个大家非常熟悉的库了,对于图像图形的处理来说,gd 库是 phper 们绕不过去的一道坎。从很早很早的 cms 或者 discuz 时代,各类开源软件在安装的时候就会明确地指出 gd 库是它们
2022-05-11 16:09:34 
摘要:在bootstrap中,12栅格系统指的是将页面布局分为等宽的1到12列,并通过比例计算来定义列宽,通过列数来定义模块化的页面布局方式,是一个响应式的、移动设备优先的栅格系统。
云活动
推荐内容
热门关键词
热门信息
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部