開閉原則(C++)
阿新 • • 發佈:2019-01-31
概念
對於擴充套件是開放的,對於更改是封閉的。面對新的需求,對程式的改動是通過新加程式碼而進行的,不是更改現有的程式碼。
簡述
開閉原則是面向物件設計的核心所在。遵循這個原則可以帶來面向物件技術所聲稱的巨大好處,也就是可維護,可擴充套件,可複用,靈活性好。開發人員應該僅對程式中出現頻繁變化的那些部分做出抽象,對於應用程式每個部分都刻意進行抽象同樣不是一個好主意。拒絕不成熟的抽象和抽象本身一樣重要。
場景一:
當前需要寫一個加減法的計算器。可以這樣實現。
UML類圖:
程式碼:
#include <stdio.h> #include <iostream> //計算器類 class Calculator { public: Calculator() { } ~Calculator() {}; double getompute(char c) { switch (c) { case '+': return mA + mB; break; case '-': return mA - mB; break; default: break; } } public: double mA; double mB; }; //客戶端 int main(void) { Calculator calculator; while (true) { std::cout << "請輸入數字:"; std::cin >> calculator.mA; std::cout << "請輸入數字:"; std::cin >> calculator.mB; std::cout << "進行計算:"; char c = '0'; std::cin >> c; std::cout << "計算結果:" << calculator.getompute(c) << std::endl; } return 0; }
場景二:
由於需求變化,現在需要加上乘法和除法。
程式碼:
//計算器類 class Calculator { public: Calculator() { } ~Calculator() {}; double getompute(char c) { switch (c) { case '+': return mA + mB; break; case '-': return mA - mB; break; case '*': return mA * mB; break; case '/': return mA / mB; break; default: break; } } public: double mA; double mB; };
修改後也可以實現功能,但如果需要再新增開方,取餘等功能。必須再次修改Calculator,明顯違背了開閉原則。
場景三:
對Calculator進行改進
UML類圖:
程式碼:
#include <stdio.h> #include <iostream> //計算器類 class Calculator { public: Calculator() { } ~Calculator() {}; //抽象介面類,子類實現 virtual double getompute() { return 0; } public: double mA; double mB; }; //除 class Division : public Calculator { public: virtual double getompute() { return mA / mB; } }; //乘 class Multiplication : public Calculator { public: virtual double getompute() { return mA * mB; } }; //減 class Subtraction : public Calculator { public: virtual double getompute() { return mA - mB; } }; //加 class Addition : public Calculator { public: virtual double getompute() { return mA + mB; } }; //工廠,根據不同的計算方式生產類 Calculator* CreateCalculator(char c) { switch (c) { case '+': return new Addition; break; case '-': return new Subtraction; break; case '*': return new Multiplication; break; case '/': return new Division; break; default: return NULL; break; } } //客戶端 int main(void) { Calculator *calculator = NULL; calculator = CreateCalculator('-'); calculator->mA = 10; calculator->mB = 5; std::cout << "計算結果:" << calculator->getompute() << std::endl; while (true) {}; return 0; }