C++设计模式-使用Qt框架模拟策略模式(Strategy)商场促销
生活随笔
收集整理的這篇文章主要介紹了
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_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:void insertListWidgetItem();void getCountPrice(double &countPrice);protected slots:void submitBtnClicked();void clearBtnClicked();private:Ui::Widget *ui; };#endif // WIDGET_Hcash.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)商场促销的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Database工作笔记-对层次库的理解
- 下一篇: Qt工作笔记-遍历文件夹里面的所有文件,