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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++设计模式-使用Qt框架模拟策略模式(Strategy)商场促销

發布時間:2025/3/15 c/c++ 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++设计模式-使用Qt框架模拟策略模式(Strategy)商场促销 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

UML圖如下:

?

如果單使用策略模式,會出現這個問題:

客戶端判斷使用哪個算法!

?

這里可以用簡單工廠與策略模式結合!

?

運行截圖如下:

?

源碼如下:

cash.h

#ifndef CASH_H #define CASH_H#include <QString>class CashSuper{public:virtual double acceptCash(double money) = 0;virtual ~CashSuper(){} };class CashNormal: public CashSuper{public:double acceptCash(double money);~CashNormal(); };class CashRebate: public CashSuper{public:CashRebate(const QString moneyRebate);double acceptCash(double money);~CashRebate();private:double m_moneyRebate; };class CashReturn: public CashSuper{public:CashReturn(const QString moneyCondition, const QString moneyReturn);double acceptCash(double money);~CashReturn();private:double m_moneyCondition;double m_moneyReturn; };class CashContext{public:CashContext(CashSuper *csuper);~CashContext();double getResult(double money);private:CashSuper *m_cs; };#endif // CASH_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:void insertListWidgetItem();void getCountPrice(double &countPrice);protected slots:void submitBtnClicked();void clearBtnClicked();private:Ui::Widget *ui; };#endif // WIDGET_H

cash.cpp

#include "cash.h" #include <QDebug>double CashNormal::acceptCash(double money) {return money; }CashNormal::~CashNormal() {qDebug()<< "CashNormal::~CashSuper() called!"; }CashRebate::CashRebate(const QString moneyRebate) {m_moneyRebate = moneyRebate.toDouble(); }double CashRebate::acceptCash(double money) {return money * m_moneyRebate; }CashRebate::~CashRebate() {qDebug()<< "CashRebate::~CashRebate() called!"; }CashReturn::CashReturn(const QString moneyCondition, const QString moneyReturn) {m_moneyCondition = moneyCondition.toDouble();m_moneyReturn = moneyReturn.toDouble(); }double CashReturn::acceptCash(double money) {double result = money;if(money >= m_moneyCondition)result = money - (int)(money / m_moneyCondition) * m_moneyReturn;return result; }CashReturn::~CashReturn() {qDebug()<< "CashReturn::~CashReturn() called!"; }CashContext::CashContext(CashSuper *csuper) {m_cs = csuper; }CashContext::~CashContext() {delete m_cs; }double CashContext::getResult(double money) {return m_cs->acceptCash(money); }

main.cpp

#include "widget.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); }

widget.cpp

#include "widget.h" #include "ui_widget.h" #include "cash.h" #include <QMessageBox> #include <QDebug>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);this->setWindowTitle("CSDN IT1995");ui->rebateComboBox->addItem("正常收費");ui->rebateComboBox->addItem("滿300減100");ui->rebateComboBox->addItem("打8折");ui->rebateComboBox->addItem("打5折");ui->rebateComboBox->addItem("拋出異常");connect(ui->submitPushButton, SIGNAL(clicked(bool)), this, SLOT(submitBtnClicked()));connect(ui->clearPushButton, SIGNAL(clicked(bool)), this, SLOT(clearBtnClicked())); }Widget::~Widget() {delete ui; }void Widget::insertListWidgetItem() {if(ui->goodsNumLineEdit->text().isEmpty() || ui->goodsPriceLineEdit->text().isEmpty())throw "goodsNumLineEdit or goodsPriceLineEdit is empty!";QString goodsNum = ui->goodsNumLineEdit->text();QString goodsPrice = ui->goodsPriceLineEdit->text();ui->goodsNumLineEdit->clear();ui->goodsPriceLineEdit->clear();ui->listWidget->addItem("商品單價:" + goodsPrice+ " 商品數量:" + goodsNum+ " 商品總價:" + QString::number(goodsPrice.toDouble() * goodsNum.toDouble())); }void Widget::getCountPrice(double &countPrice) {for(int i = 0; i < ui->listWidget->count(); i++){QStringList list = ui->listWidget->item(i)->text().split("商品總價:");countPrice += list[list.size() - 1].toDouble();} }void Widget::submitBtnClicked() {CashContext *cc = NULL;try{if(ui->rebateComboBox->currentText() == "正常收費"){cc = new CashContext(new CashNormal);}else if(ui->rebateComboBox->currentText() == "滿300減100"){cc = new CashContext(new CashReturn("300", "100"));}else if(ui->rebateComboBox->currentText() == "打8折"){cc = new CashContext(new CashRebate("0.8"));}else if(ui->rebateComboBox->currentText() == "打5折"){cc = new CashContext(new CashRebate("0.5"));}else{throw "the text of rebateComboBox is unnormal!";}insertListWidgetItem();double countPrice = 0.0;getCountPrice(countPrice);QString priceStr = QString::number(cc->getResult(countPrice));ui->countPriceLabel->setText("總價:" + priceStr);}catch(const char *err){QMessageBox::information(this, "info", QString(err));}if(cc != NULL)delete cc; }void Widget::clearBtnClicked() {ui->listWidget->clear();ui->countPriceLabel->setText("總價:"); }

?

?

總結

以上是生活随笔為你收集整理的C++设计模式-使用Qt框架模拟策略模式(Strategy)商场促销的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。