軟件架構設計原則之開閉原則


開閉原則(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彈架構:30個設計模式真實案例(附源碼),挑戰年薪60W不是夢

本文為“Tom彈架構”原創,轉載請注明出處。技術在於分享,我分享我快樂!
如果本文對您有幫助,歡迎關注和點贊;如果您有任何建議也可留言評論或私信,您的支持是我堅持創作的動力。關注微信公眾號『 Tom彈架構 』可獲取更多技術干貨!

其他設計原則

Tom彈架構:依賴倒置原則(Dependence Inversion Principle,DIP)

Tom彈架構:單一職責原則(Simple Responsibility Pinciple,SRP)

Tom彈架構:接口隔離原則(Interface Segregation Principle, ISP)

Tom彈架構:迪米特原則(Law of Demeter LoD)

Tom彈架構:里氏替換原則(Liskov Substitution Principle,LSP)

Tom彈架構:合成復用原則(Composite/Aggregate Reuse Principle,CARP)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM