前言
學習設計原則,學習設計模式的基礎。在實際開發過程中,並不是一定要求所有代碼都遵循設計原則,我們要考慮人力、時間、成本、質量,不是刻意追求完美,要在適當的場景遵循設計原則,體現的是一種平衡取舍,幫助我們設計出更加優雅的代碼結構。
開閉原則(Open-Closed Principle, OCP)
定義 : 一個軟件實體如類,模塊和函數應該對擴展開放,對修改關閉,開閉原則也是其他五個原則的基石
開閉原則是指一個軟件實體如類、模塊和函數應該對擴展開放, 對修改關閉。所謂的開閉,也正是對擴展和修改兩個行為的一個原則。強調的是用抽象構建框架,用實現擴展細節。可以提高軟件系統的可復用性及可維護性。
開閉原則是面向對象設計中最基礎的設計原則。它指導我們如何建立穩定靈活的系統,例如:我們版本更新,我盡可能不修改源代碼,但是可以增加新功能。
在現實生活中對於開閉原則也有體現。比如,很多互聯網公司都實行彈性制作息時間,規定每天工作 8 小時。意思就是說,對於每天工作 8 小時這個規定是關閉的,但是你什么時候來,什么時候走是開放的。早來早走,晚來晚走。
下面我們以華為手機為例,首先創建一個華為手機接口:IHuaWei:

package com.wbg.dpsp.openClose; /** * @author WBG * @date 2020/8/2 0:14 * @describe 華為手機 */ public interface IHuaWei { String getUUID();//主鍵 String getName();//名稱 Double getPrice();//價格 }
華為手機分為2G\3G\4G\5G,我們來創建一個G5手機

package com.wbg.dpsp.openClose; /** * @author WBG * @date 2020/8/2 0:23 * @describe //華為5G */ public class HuaWei5G implements IHuaWei { private String UUID; private String name; private Double price; public HuaWei5G() { } public HuaWei5G(String UUID, String name, Double price) { this.UUID = UUID; this.name = name; this.price = price; } public String getUUID() { return this.UUID; } public String getName() { return this.name; } public Double getPrice() { return this.price; } }
華為5G需要做一個活動,價格優惠,如果修改HuaWei5G中的getPrice()方法,則會影響其他地方調用,我們如何在不修改原有代碼前提前下,實現價格優惠這個功能呢?現在,我們再寫一個處理優惠邏輯的類:HuaWei5GDiscount

package com.wbg.dpsp.openClose; /** * @author WBG * @date 2020/8/2 0:25 * @describe 華為5G促銷活動 */ public class HuaWei5GDiscount extends HuaWei5G { public HuaWei5GDiscount() { super(); } public HuaWei5GDiscount(String UUID, String name, Double price) { super(UUID, name, price); } //打折活動 public Double getDiscountPrice() { //六折優惠 return super.getPrice() * 0.85; } }
測試結果:

package com.wbg.dpsp.openClose; /** * @author WBG * @date 2020/8/2 0:30 * @describe */ public class Test { public static void main(String[] args) { IHuaWei iHuaWei = new HuaWei5GDiscount("202008020031001","華為麥芒 9",2199.00); HuaWei5GDiscount huaWei5GDiscount = (HuaWei5GDiscount) iHuaWei; System.out.println("手機標識號:" + huaWei5GDiscount.getUUID() + "手機名稱:《" + huaWei5GDiscount.getName() + "》" + "\n原價:" + huaWei5GDiscount.getPrice() + "\n售價:" + huaWei5GDiscount.getDiscountPrice()); } }
類結構圖: