程序运行截图如下:

理论:

面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类。

注意:这个模式值解决了对象创建的问题,工厂本身包含了所有收费方式,每一次维护或扩展收费方式都要改动动词,导致代码要重写编译部署,这是个方法,但不是最好的方法!

源码如下:

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_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 - (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框架采用简单工厂模式实现商城打折满减案例相关推荐

  1. 设计模式学习笔记二:简单工厂模式

    含义: 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创 ...

  2. [Python设计模式] 第1章 计算器——简单工厂模式

    github地址:https://github.com/cheesezh/python_design_patterns 写在前面的话 """ 读书的时候上过<设计模 ...

  3. 设计模式【2.1】-- 简单工厂模式怎么演变成工厂方法模式?

    还记得前面的简单工厂模式么?我们开了一个水果工厂FruitFactory,生产三种水果Apple,Pear,Orange.今天给大家讲讲工厂方法模式: 老板搞水果工厂赚了点小钱,准备扩大生产,每个工厂 ...

  4. 常用设计模式系列(一)—简单工厂模式

    hello各位程序员大哥大姐好,上期我讲解了设计模式的概念及分类,学习了UML类图的认识,今天我们就趁热打铁,学习一下简单工厂模式,以后每一个模式会出一篇文章,供各位及我自己查阅学习.斗图还是不能忘的 ...

  5. 设计模式学习-每日一记(1.简单工厂模式)

    简单工厂模式 A.定义: 定义一个用于创建对象的接口. B.定义分析: "定义一个用于创建对象的接口". 这个模式的应用主要是定义一个接口,每个类都会有接口,对于面向对象语言就是定 ...

  6. 设计模式学习(1)简单工厂模式:君子远庖厨

    一.题引 在<孟子·梁惠王上>有如此一句话:"君子之于禽兽也,见其生,不忍见其死:闻其声,不忍食其肉.是以君子远庖厨也."翻译过来意思是:"君子对于飞禽走兽, ...

  7. Qt下实现简单工厂设计模式

    简述 简单工厂设计模式是一种基础简单而常用的设计模式,对理解封装.继承和多态特性有非常大的帮助.下面就来在Qt下实现简单工厂模式. 代码之路 实现简单工厂至少需要四个类.其中最主要的两个类是工厂类和一 ...

  8. 设计模式学习笔记(三)工厂模式中的简单工厂、工厂方法和抽象工厂模式之间的区别

    设计模式中的工厂模式(Factory Design pattern)是一个比较常用的创建型设计模式,其中可以细分为三种:简单工厂(Simple Factory).工厂方法(Factory Method ...

  9. 二次封装图片第三方框架——简单工厂模式的运用

    CSDN首发地址: 前言 写在前头,这篇博客对于老司机们没什么多大的意义,老司机们就不用看了,对于新手还是有很大实用价值的. 平时在项目中,你们有没有遇到这样的情况,比如之前项目是使用开源框架Imag ...

最新文章

  1. qchart 图表_Qt下绘制图表——QtCharts版
  2. multiple root tags怎么解决_手机ROOT后交管12123打不开怎么解决;EdXposed使用QX模块微X教程...
  3. shortcut icon 修改浏览器标签网站图标
  4. 老司机做VR视频,需要什么样的全景相机?
  5. python基础代码的含义_Python基础学习篇
  6. HDU 5410 CRB and His Birthday ——(完全背包变形)
  7. OpenCV中反向投影
  8. HashMap 排序
  9. MyEclipse搭建SSH(Struts2+Spring2+Hibernate3)框架项目教程
  10. 六石管理学:行政人员也要学会使用SVN保存文档
  11. 架构之美 | 按图索骥,就能做好架构图!
  12. 微信公众号开发之消息的自动回复
  13. 创业 和 移动互联网
  14. wxid转微信号软件执行代码。
  15. usart hmi(串口屏)常用命令
  16. java计算机毕业设计银创科技有限公司人事信息系统源码+数据库+系统+lw文档+部署
  17. 第三方支付接口响应超时处理方法
  18. 写作必备文献搜索网大全
  19. DFD图转化成SD图
  20. 泰勒展开:一阶,二阶

热门文章

  1. Modularity QuickStart学习
  2. 老板要做数字化转型,干了3个月的脏活累活,我被开除了
  3. 如何用C++来计算大数字乘法
  4. 免费软件做的不错的,这里要说一个叫《飞秋》的软件
  5. 【转载】浅析游戏引擎开发
  6. SMTP协议原始命令码和工作原理
  7. 当前FreeBSD的版本
  8. 02ODBC基本概念
  9. 面试刷题必看!Python中的5大排序算法及其实现代码
  10. 今天女同事说月经不调:加班加的!我们为什么不敢闲?