C++设计模式-开放-封闭原则基本概念与实例
目錄
?
基本概念
舉一個例子
基本概念
在如那就的設(shè)計模式中,不能修改,但可以擴展的實現(xiàn)是一條十分重要的原則,它是開放-封閉原則(The Open-Clossed Principle,簡稱OCP)或開-關(guān)閉原則;
開放-封閉原則,軟件實體(類、模塊、函數(shù)等)應(yīng)該可以擴展,但不能修改。【ASD】
對于擴展是開放的(Open for extension),對于更改是封閉的(Closed for modification)【ASD】
【注意】不要指望在系統(tǒng)一開始時需求確定,就不會變化了,這是不科學(xué)的想法,,既然需求是會變化的,那么如何在面對需求變化時,設(shè)計軟件可以相對容易的修改,不至于新系統(tǒng)一來,老系統(tǒng)推倒。
設(shè)計軟件時,要時時刻刻的考慮,盡量讓這個類足夠好,寫好就不要去修改了,但新需求來了,增加一些類就完事了,原理的代碼則不能動。
無論模板是多么的封閉,都會存在一些無法對之封閉的變化。既然不能完全封閉,設(shè)計人員必須對于他設(shè)計的模塊應(yīng)該對哪些變化封閉做出選擇。他必須先猜出最有可能發(fā)送變化的種類,然后構(gòu)造抽象來隔離那些變化【ASD】
在最初寫代碼的時候,假設(shè)變化不會發(fā)生。當(dāng)變化發(fā)生時,我們創(chuàng)建抽象來隔離以后發(fā)送的同類變化【ASD】。
【總結(jié)】
開放-封閉原則是面向?qū)ο笤O(shè)計的核心所在。遵循這個原則可以帶來面向?qū)ο蠹夹g(shù)所聲明的巨大好處,也就是可維護、可擴展、可復(fù)用、靈活性好。開發(fā)人員應(yīng)該僅對程序中呈現(xiàn)出頻繁變化的哪些部分做出抽象,然而,對于應(yīng)用程序中每個部分都刻意的進行抽象同樣不是一個好主意。拒絕不成熟的抽象和抽象本身一樣重要【ASD】。
?
舉一個例子
做一個計算器啥的!
目錄結(jié)構(gòu)如下:
?
UML圖如下:
程序運行截圖如下:
源碼如下:
operation.h
#ifndef OPERATION_H #define OPERATION_Hclass Operation { public:Operation();virtual ~Operation();double getNumberA() const;void setNumberA(const double number);double getNumberB() const;void setNumberB(const double number);virtual double getResult();double m_numberA;double m_numberB; };#endif // OPERATION_Hoperationfactory.h
#ifndef OPERATIONFACTORY_H #define OPERATIONFACTORY_H#include "otheroperation.h" #include <QString>class OperationFactory{public:static Operation *createOperation(QString operate){Operation *oper = NULL;if(operate == "+"){oper = new OperationAdd;}else if(operate == "-"){oper = new OperationSub;}else if(operate == "*"){oper = new OperationMul;}else if(operate == "/"){oper = new OperationDiv;}else{throw "The opertation is error!";}return oper;} };#endif // OPERATIONFACTORY_Hotheroperation.h
#ifndef OTHEROPERATION_H #define OTHEROPERATION_H#include <operation.h>class OperationAdd: public Operation{public:double getResult() override;~OperationAdd(); };class OperationSub: public Operation{public:double getResult() override;~OperationSub(); };class OperationMul: public Operation{public:double getResult() override;~OperationMul(); };class OperationDiv: public Operation{public:double getResult() override;~OperationDiv(); };#endif // OTHEROPERATION_Hwidget.h
#ifndef WIDGET_H #define WIDGET_H#include <QWidget>namespace Ui { class Widget; }class Widget : public QWidget {Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();protected slots:void btnClicked();private:Ui::Widget *ui; };#endif // WIDGET_Hmain.cpp
#include "widget.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); }operation.cpp
#include "operation.h" #include <QDebug>Operation::Operation() {m_numberA = 0.0;m_numberB = 0.0; }Operation::~Operation() {qDebug()<< "Operation::~Operation() called"; }double Operation::getNumberA() const {return m_numberA; }void Operation::setNumberA(const double number) {m_numberA = number; }double Operation::getNumberB() const {return m_numberB; }void Operation::setNumberB(const double number) {m_numberB = number; }double Operation::getResult() {double result = 0.0;return result; }otheroperation.cpp
#include "otheroperation.h" #include <QDebug>double OperationAdd::getResult() {double result = 0.0;result = m_numberA + m_numberB;return result; }OperationAdd::~OperationAdd() {qDebug()<< "OperationAdd::~OperationAdd() called!"; }double OperationSub::getResult() {double result = 0.0;result = m_numberA - m_numberB;return result; }OperationSub::~OperationSub() {qDebug()<< "OperationSub::~OperationSub() called!"; }double OperationMul::getResult() {double result = 0.0;result = m_numberA * m_numberB;return result; }OperationMul::~OperationMul() {qDebug()<< "OperationMul::~OperationMul() called!"; }double OperationDiv::getResult() {double result = 0.0;if(m_numberB < 0.0001 )throw "The denominator cannot be zero";result = m_numberA / m_numberB;return result; }OperationDiv::~OperationDiv() {qDebug()<< "OperationDiv::~OperationDiv() called!"; }widget.cpp
#include "widget.h" #include "ui_widget.h" #include "operationfactory.h"#include <QDebug>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);this->setWindowTitle("CSDN IT1995");QStringList list;list << "+" << "-" << "*" << "/";ui->operatorComboBox->addItems(list);connect(ui->pushButton, SIGNAL(clicked(bool)), this, SLOT(btnClicked())); }Widget::~Widget() {delete ui; }void Widget::btnClicked() {if(ui->num1LineEdit->text().isEmpty() || ui->num2LineEdit->text().isEmpty())return;Operation *oper = NULL;try{oper = OperationFactory::createOperation(ui->operatorComboBox->currentText());oper->setNumberA(ui->num1LineEdit->text().toDouble());oper->setNumberB(ui->num2LineEdit->text().toDouble());ui->resultLineEdit->setText(QString::number(oper->getResult()));}catch(const char *err){qDebug()<< err;}if(oper != NULL){delete oper;} }?
總結(jié)
以上是生活随笔為你收集整理的C++设计模式-开放-封闭原则基本概念与实例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt文档阅读笔记-windowOpaci
- 下一篇: C++ opengl 放置摄像机