开放闭合原则的理解

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())
}

References

  1. 开闭原则(OCP)
  2. Go设计模式之开闭设计原则
  3. 七大设计原则-golang实现