開閉原則(Open-Closed Principle,OCP)是指一個軟件實體(如類、模塊和函數)應該對擴展開放,對修改關閉。所謂的開閉,也正是對擴展和修改兩個行為的一個原則。它強調的是用抽象構建框架,用實現擴展細節,可以提高軟件系統的可復用性及可維護性。開閉原則是面向對象設計中最基礎的設計原則,它指導我們如何建立穩定、靈活的系統。例如版本更新,我們盡可能不修改源代碼,但是可以增加新功能。
在現實生活中開閉原則也有體現。比如,很多互聯網公司都實行彈性作息時間,只規定每天工作8小時。意思就是說,對於每天工作8小時這個規定是關閉的,但是你什么時候來、什么時候走是開放的。早來早走,晚來晚走。
開閉原則的核心思想就是面向抽象編程,接下來我們來看一段代碼。
以咕泡學院的課程體系為例,首先創建一個課程接口ICourse:
public interface ICourse {
Integer getId();
String getName();
Double getPrice();
}
整個課程生態有Java架構、大數據、人工智能、前端、軟件測試等,我們來創建一個Java架構課程的類JavaCourse:
public class JavaCourse implements ICourse{
private Integer Id;
private String name;
private Double price;
public JavaCourse(Integer id, String name, Double price) {
this.Id = id;
this.name = name;
this.price = price;
}
public Integer getId() {
return this.Id;
}
public String getName() {
return this.name;
}
public Double getPrice() {
return this.price;
}
}
現在我們要給Java架構課程做活動,價格優惠。如果修改JavaCourse中的getPrice()方法,則存在一定的風險,可能影響其他地方的調用結果。我們如何在不修改原有代碼的前提前下,實現價格優惠這個功能呢?現在,我們再寫一個處理優惠邏輯的類JavaDiscountCourse(思考一下為什么要叫JavaDiscountCourse,而不叫DiscountCourse):
public class JavaDiscountCourse extends JavaCourse {
public JavaDiscountCourse(Integer id, String name, Double price) {
super(id, name, price);
}
public Double getOriginPrice(){
return super.getPrice();
}
public Double getPrice(){
return super.getPrice() * 0.61;
}
}
回顧一下,簡單看一下類結構圖,如下圖所示。

關注微信公眾號『 Tom彈架構 』回復“設計模式”可獲取完整源碼。
本文為“Tom彈架構”原創,轉載請注明出處。技術在於分享,我分享我快樂!
如果本文對您有幫助,歡迎關注和點贊;如果您有任何建議也可留言評論或私信,您的支持是我堅持創作的動力。關注微信公眾號『 Tom彈架構 』可獲取更多技術干貨!
其他設計原則
Tom彈架構:依賴倒置原則(Dependence Inversion Principle,DIP)
Tom彈架構:單一職責原則(Simple Responsibility Pinciple,SRP)
Tom彈架構:接口隔離原則(Interface Segregation Principle, ISP)
Tom彈架構:迪米特原則(Law of Demeter LoD)
