深入浅出设计模式原则之开闭原则(OCP)
生活随笔
收集整理的這篇文章主要介紹了
深入浅出设计模式原则之开闭原则(OCP)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
下面以兩個例子來解釋開閉原則(程序代碼)
【按例1】Windows 的桌面主題設計
分析:Windows 的主題是桌面背景圖片、窗口顏色和聲音等元素的組合。用戶可以根據自己的喜愛更換自己的桌面主題,也可以從網上下載新的主題。這些主題有共同的特點,可以為其定義一個抽象類(Abstract Subject),而每個具體的主題(Specific Subject)是其子類。用戶窗體可以根據需要選擇或者增加新的主題,而不需要修改原代碼,所以它是滿足開閉原則的,其類圖如圖 1 所示。
#include <QCoreApplication> #include <iostream>/*!* \brief 抽象主題類*/ class AbstractSubject{ public:virtual void Display(void) = 0; };/*!* \brief The SpecificSubject1 class*/ class SpecificSubject1:public AbstractSubject{ public:virtual void Display(void){std::cout<<"SpecificSubject1"<<std::endl;} };/*!* \brief The SpecificSubject2 class*/ class SpecificSubject2:public AbstractSubject{ public:virtual void Display(void){std::cout<<"SpecificSubject2"<<std::endl;} };int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);AbstractSubject *subject = new SpecificSubject1;subject->Display();delete subject;return a.exec(); }【例子2】簡單運算器
#include <QCoreApplication> #include <iostream>/*!* \brief 運算類*/ class Calculator{ public:Calculator(int a, int b, std::string mop){this->_ma = a;this->_mb = b;this->_moperator = mop;}int getResult(){if (_moperator.compare("+") == 0)return _ma + _mb;else if (_moperator.compare("-") == 0)return _ma - _mb;else if (_moperator.compare("*") == 0)return _ma * _mb;elsereturn 0;} public:int _ma;int _mb;std::string _moperator; };int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);Calculator *myCal = new Calculator(10,20,"+");std::cout<<myCal->getResult()<<std::endl;delete myCal;return a.exec(); }以上代碼代碼不符合開閉原則,按開閉原則應修改如下:?
#include <QCoreApplication> #include <iostream>/*!* \brief 抽象計算器類*/ class AbstractCalculator { public:virtual int GetResult() = 0;virtual void SetOperatorNumber(int a, int b) = 0; public:int _mA;int _mB; };/*!* \brief 加法計算器類*/ class PlusCalculator :public AbstractCalculator { public:virtual void SetOperatorNumber(int a, int b){this->_mA = a;this->_mB = b;}virtual int GetResult(){return _mA + _mB;} };/*!* \brief 減法計算器類*/ class MinuteCalculator :public AbstractCalculator { public:virtual void SetOperatorNumber(int a, int b){this->_mA = a;this->_mB = b;}virtual int GetResult(){return _mA - _mB;} };/*!* \brief 乘法計算器類*/ class MultiplyCalculator :public AbstractCalculator { public:virtual void SetOperatorNumber(int a, int b){this->_mA = a;this->_mB = b;}virtual int GetResult(){return _mA * _mB;} };int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);AbstractCalculator *calculator = new PlusCalculator;calculator->SetOperatorNumber(10, 20);std::cout << calculator->GetResult() << std::endl;delete calculator;return a.exec(); }?增加一個方法,無需修改源代碼,只需新增一個類即可。
?
開閉原則的核心思想是:對擴展開放,對修改關閉。在程序需要進行拓展的時候,不能去修改原有的代碼,實現一個熱插拔的效果。簡言之,是為了使程序的擴展性好,易于維護和升級。想要達到這樣的效果,我們需要使用接口和抽象類,后面的具體設計中我們會提到這點。
參考:
?
總結
以上是生活随笔為你收集整理的深入浅出设计模式原则之开闭原则(OCP)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 上海新华医院外地车限行吗?
- 下一篇: 深入浅出设计模式原则之里氏代换原则(Li