設計模式(2):JAVA(2):軟體設計原則(2)開閉原則:對擴充套件開放(新功能),對修改關閉(舊功能)
阿新 • • 發佈:2021-09-04
開閉原則:對擴充套件開放(新功能),對修改關閉(舊功能)
建立了一個汽車物件
class Car { private String band; private String color; private float price; public String getBand() { return band; } public void setBand(String band) { this.band = band; }public String getColor() { return color; } public void setColor(String color) { this.color = color; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } @Overridepublic String toString() { return "Car{" + "band='" + band + '\'' + ", color='" + color + '\'' + ", price=" + price + '}'; } } public static void main(String[] args) { Car car = new Car(); car.setBand("bm"); car.setColor("red"); car.setPrice(13.3f); System.out.println(car.toString()); }
當變化來臨時,例如汽車的價格現在需要打折(打8折),這時,我們在Car的原始碼中修改,就違反了開閉原則
反例:修改了原始碼
public void setPrice(float price) { this.price = (price*0.08f); }
開發時,我們應該要去考慮變化的需求,屬性會在任何時刻都有可能產生變化
對待變化時,我們應該選擇擴充套件,而不是去修改原始碼(ps:在強制要求符合開閉原則的情況下!)
正例:
//進行擴充套件 class DiscountCar extends Car{ @Override public void setPrice(float price) { super.setPrice(price*0.08f); } } public static void main(String[] args) { //===使用向上轉型時,方法的呼叫只和new的物件有關 Car car = new DiscountCar(); car.setBand("bm"); car.setColor("red"); car.setPrice(130000f); System.out.println(car.toString()); }
開閉原則應該遵循應用場景去考慮,如果原始碼就是你自己寫的,而且需求是穩定的,那麼,直接修改原始碼也是一個簡單的做法,但當原始碼是別人的程式碼或架構是,我們就要去符合開閉原則,防止破壞結構的完整性!
本文來自部落格園,作者:秋華,轉載請註明原文連結:https://www.cnblogs.com/qiu-hua/p/15227064.html