日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++设计模式-开放-封闭原则基本概念与实例

發(fā)布時間:2025/3/15 c/c++ 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++设计模式-开放-封闭原则基本概念与实例 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

?

基本概念

舉一個例子


基本概念

在如那就的設(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_H

operationfactory.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_H

otheroperation.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_H

widget.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_H

main.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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。