golang架构设计开闭原则手写实现

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.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架构设计开闭原则的资料请关注易知道(ezd.cc)其它相关文章!

推荐阅读

    golang代理怎么设置

    golang代理怎么设置,代理,请求,设置,语言,客户端,应用程序,Go语言(或称Golang)是一种广受欢迎的编程语言,尤其适用于网络编程。在创建Web应用程序

    什么是golang

    什么是golang,语言,执行,编程语言,机器语言,高级语言,运行,golang是一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言;它可以在不损

    Golang之wait.Until 简单测试用例

    Golang之wait.Until 简单测试用例,结束,主程序,测试目的,验证wait.Until的用法 //测试wait.Until() 的用途package mainimport ( "fmt

    使用Golang实现简单Ping过程

    使用Golang实现简单Ping过程,报文,字节,摘要: Ping的基本原理是发送和接受ICMP请求回显报文,利用Go语言可以轻松实现这一过程,较之C/C++语言

    golang二进制读写文件-二进制文件

    golang二进制读写文件-二进制文件有些时候,我突然想知道MySQL的如何存储数据的.她是如何完整的获取某行的数据,并且获得每个字段的值.比如,我

    GoLang下载安装-bin文件安装

    GoLang下载安装-bin文件安装GoLang IDEA https://www.jetbrains.com/go/download/download-thanks.htmlgolang特性:Go原生支持并发(Concur

    Golang gRPC HTTP协议转换示例

    Golang gRPC HTTP协议转换示例gRPC HTTP协议转换
    正当有这个需求的时候,就看到了这个实现姿势。源自coreos的一篇博客,转载到了grpc官方

    Golang泛型的使用方法详解

    Golang泛型的使用方法详解目录1. 泛型是什么2. 泛型的简单使用2.1. 泛型示例2.2. 自定义泛型类型2.3. 调用带泛型的函数3. 自定义泛型类