C++设计模式-使用Qt框架采用简单工厂模式实现商城打折满减案例
生活随笔
收集整理的這篇文章主要介紹了
C++设计模式-使用Qt框架采用简单工厂模式实现商城打折满减案例
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
程序運行截圖如下:
?
理論:
面向對象的編程,并不是類越多越好,類的劃分是為了封裝,但分類的基礎是抽象,具有相同屬性和功能的對象的抽象集合才是類。
注意:這個模式值解決了對象創建的問題,工廠本身包含了所有收費方式,每一次維護或擴展收費方式都要改動動詞,導致代碼要重寫編譯部署,這是個方法,但不是最好的方法!
?
源碼如下:
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 CashFactory{ public:static CashSuper *createCashAccept(const QString type);};#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 - (money / m_moneyCondition) * m_moneyReturn;return result; }CashReturn::~CashReturn() {qDebug()<< "CashReturn::~CashReturn() called!"; }CashSuper *CashFactory::createCashAccept(const QString type) {CashSuper *cs = nullptr;if(type == "正常收費"){cs = new CashNormal;}else if(type == "滿300減100"){cs = new CashReturn("300", "100");}else if(type == "打8折"){cs = new CashRebate("0.8");}else if(type == "打5折"){cs = new CashRebate("0.5");}else{throw "The type is error";}return cs; }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() {CashSuper *csuper = NULL;try{insertListWidgetItem();double countPrice = 0.0;csuper = CashFactory::createCashAccept(ui->rebateComboBox->currentText());getCountPrice(countPrice);QString priceStr = QString::number(csuper->acceptCash(countPrice));ui->countPriceLabel->setText("總價:" + priceStr);}catch(const char * err){QMessageBox::information(this, "提示", QString(err));}if(csuper != NULL)delete csuper;}void Widget::clearBtnClicked() {ui->listWidget->clear();ui->countPriceLabel->setText("總價:"); }UML圖如下:
總結
以上是生活随笔為你收集整理的C++设计模式-使用Qt框架采用简单工厂模式实现商城打折满减案例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: staf工作笔记-使用stax并行处理获
- 下一篇: STL|QTL工作笔记-QString与