設計模式原則——開放封閉原則
阿新 • • 發佈:2019-01-08
設計模式一共有六大原則:
單一原則、開放封閉原則、介面分離原則、里氏替換原則、最少知識原則、依賴倒置原則。
這篇部落格是自己對開放封閉設計原則的一些拙見,有何不對歡迎大家指出。
開放封閉原則:
軟體實體(類,模組,函式等)應該可以擴充套件,但是不可修改。
(解釋:其原則就是,設計一個類的時候時刻考慮,儘量要這個類足夠的好,寫好了就不要去修改了,如果有了新的需求變化,增加一個類就完事!原來的程式碼就不動了。)
開放封閉原則是面向物件的核心所在。遵循這個原則可以帶來面向物件的四個好處(可維護,可擴充套件,可複用,靈活性好)。開發中,對頻繁變化的那部分做出抽象的處理。
特徵:
1,對擴充套件是開放的。
2,對修改是封閉的。
Demo:
我們來建立一個計算器。
1,不遵守開放封閉原則
UML:
/** * 計算器的實現(無設計模式) * @author tujietg * */ public class Calculator { public static void main(String[] args) throws Exception { Scanner scanner; System.out.println("輸入a:"); scanner = new Scanner(System.in);int a = scanner.nextInt(); System.out.println("輸入b:"); scanner = new Scanner(System.in); int b = scanner.nextInt(); System.out.println("輸入:sign"); scanner = new Scanner(System.in); String sign = scanner.nextLine(); System.out.println(Operation(a, b, sign)); }public static int Operation(int a, int b, String sign) throws Exception { int sum = 0; switch (sign) { case "+": sum = a + b; break; case "-": sum = a - b; break; case "*": sum = a * b; break; case "/": if (b == 0) { throw new Exception("被除數不能為0"); } sum = a / b; break; } return sum; } }
如果現在增加一個平方的運算。需要修改原本寫好的類(calculator),這違背了開放封閉原則。
2,遵循開放原則
UML:
通過UML圖可以看出,遵循開放封閉原則的實現多了一個抽象的運算類。
運算抽象類:
public abstract class Operation { int FirstNum; int SecondNum; public int getFirstNum() { return FirstNum; } public void setFirstNum(int firstNum) { FirstNum = firstNum; } public int getSecondNum() { return SecondNum; } public void setSecondNum(int secondNum) { SecondNum = secondNum; } public abstract int getResult() throws Exception; }
運算實現類:
//加法 class OperationAddImpl extends Operation { @Override public int getResult() { return FirstNum + SecondNum; } } //除法 class OperationDivImpl extends Operation { @Override public int getResult() throws Exception { if (SecondNum == 0) { throw new Exception("被除數不能為0"); } else { return FirstNum / SecondNum; } } } //減法 class OperationSubImpl extends Operation { @Override public int getResult() { return FirstNum - SecondNum; } } //乘法 class OperationMulDivImpl extends Operation { @Override public int getResult() { return FirstNum * SecondNum; } }
當我們的程式碼設計遵循了開放封閉原則時,這時,如果我們需要增加一個平方的需求,我們只需要建立一個平方的類(extends抽象類)。
這樣做,我們保持了原有程式碼的封閉效果,同時,實現了對擴充套件的開放。
總結:
對業務中經常變化的模組進行抽象。
拒絕濫用抽象,業務中變化頻率高的才考慮用抽象的方式。