开放闭合原则的理解
开放闭合原则的理解以及在 Go 中的运用
OCP
开闭原则(Open-Closed Principle, OCP) :一个软件实体如类、模块和函数应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。
用抽象构建框架,用实现扩展细节。
理解 OCP
开闭原则是设计模式中的总原则,开闭原则就是说:对拓展开放、对修改关闭。模块应该在尽不修改代码的前提下进行拓展,这就需要使用接口和抽象类来实现预期效果。
实现开闭原则的核心思想,就是面向抽象继承。 优点是提高软件系统的可复用性和可维护性。
Golang Demo
package openclose
type CourseInterface interface {
GetID() int
GetName() string
GetPrice() float32
}
package openclose
type Course struct {
id int
name string
price float32
}
func NewCourse(id int, name string, price float32) *Course {
return &Course{id: id, name: name, price: price}
}
func (j *Course) GetID() int {
return j.id
}
func (j *Course) GetName() string {
return j.name
}
func (j *Course) GetPrice() float32 {
return j.price
}
package openclose
type DiscountCourse struct {
Course
}
func NewDiscountCourse(ID int, name string, price float32) *DiscountCourse {
return &DiscountCourse{Course: *NewCourse(ID, name, price)}
}
func (j *DiscountCourse) GetOriginPrice() float32 {
return j.GetPrice()
}
func (j *DiscountCourse) GetDiscountPrice() float32 {
return j.GetPrice() * 0.8
}
package openclose
import (
"testing"
)
func TestOpenClose(t *testing.T) {
course := NewDiscountCourse(1, "JavaEE", 10)
t.Logf("\nid:%d,\n名称:%s,\n价格:%f,\n折后价格:%f\n", course.GetID(), course.GetName(), course.GetPrice(), course.GetDiscountPrice())
}
Public discussion