1. 程式人生 > >設計模式原則——開放封閉原則

設計模式原則——開放封閉原則

設計模式一共有六大原則:

單一原則、開放封閉原則、介面分離原則、里氏替換原則、最少知識原則、依賴倒置原則。

這篇部落格是自己對開放封閉設計原則的一些拙見,有何不對歡迎大家指出。

開放封閉原則:

軟體實體(類,模組,函式等)應該可以擴充套件,但是不可修改。

(解釋:其原則就是,設計一個類的時候時刻考慮,儘量要這個類足夠的好,寫好了就不要去修改了,如果有了新的需求變化,增加一個類就完事!原來的程式碼就不動了。)

開放封閉原則是面向物件的核心所在。遵循這個原則可以帶來面向物件的四個好處(可維護,可擴充套件,可複用,靈活性好)。開發中,對頻繁變化的那部分做出抽象的處理。

特徵:

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抽象類)。

這樣做,我們保持了原有程式碼的封閉效果,同時,實現了對擴充套件的開放。

總結:

對業務中經常變化的模組進行抽象。

拒絕濫用抽象,業務中變化頻率高的才考慮用抽象的方式。