zoukankan      html  css  js  c++  java
  • qt实现策略模式与工厂模式结合

    strategy.h头文件

    #ifndef STRATEGY_H
    #define STRATEGY_H

    #include <qstring.h>
    #include <ctype.h>
    #include <string.h>

    class CashSuper
    {
    public:
        virtual double GetCashResult(const double &money)=0;
    };

    class CashNormal:public CashSuper
    {
    public:
        double GetCashResult(const double &money)
        {
            return money;
        }
    };

    class CashReturn:public CashSuper
    {
    public:
        CashReturn(const QString &returnmoney, const QString &returncondition)
        {
            this->m_returncondition=returncondition.toDouble();
            this->m_returnmoney=returnmoney.toDouble();
        }
        double GetCashResult(const double &money)
        {
            if(money>=this->m_returncondition)
                return money-this->m_returnmoney;
            return money;
        }

    private:
        double m_returnmoney;
        double m_returncondition;
    };

    class CashDiscount:public CashSuper
    {
    public:
        CashDiscount(const QString &Discount)
        {
            this->m_Discount=Discount.toDouble();
        }
        double GetCashResult(const double &money)
        {
            return money*this->m_Discount*0.1;
        }
    private:
        double m_Discount;
    };


    class CashFactory
    {
    public:
       CashSuper* CreateCash(const size_t &type, QString stype)  //生成对象
        {
            CashSuper* pObject;

            switch(type)
            {
            case 0:
                pObject=new CashNormal;
                break;
            case 1:
                pObject=new CashReturn(GetQStringInt(stype), GetQStringInt(stype));
                break;
            case 2:

                pObject=new CashDiscount(GetQStringInt(stype));
                break;
            }

            return pObject;
        }

    private:
       QString GetQStringInt(QString &pSrc)    //找出数字用来计算
       {
           QString tmp;
           char* ptmp=(char*)malloc(pSrc.length()+1);
           int pos=0;
           int saveaddr=(int)ptmp;

           strcpy(ptmp,pSrc.toLatin1().data());
           while(!isdigit(*ptmp++));
           ptmp--;

           while(isdigit(*ptmp)|| '.'==*ptmp)
           {
               tmp.append(*ptmp);
               ptmp++;
           }
           pos=pSrc.indexOf(pSrc);
           pSrc=pSrc.right(pos+tmp.length());

           ptmp=(char*)saveaddr;
           free(ptmp);
           ptmp=NULL;
           return tmp;
       }
    };

    #endif // STRATEGY_H

    //--------------------------------------------------
     
    #ifndef DIALOG_H
    #define DIALOG_H

    #include <QDialog>
    #include "strategy.h"

    namespace Ui {
        class Dialog;
    }


    class Dialog : public QDialog
    {
        Q_OBJECT

    public:
        explicit Dialog(QWidget *parent = 0);
        ~Dialog();

    private slots:
        void on_comboBox_aritype_activated(QString );
        void on_pushButton_reset_clicked();
        void on_pushButton_sure_clicked();

    private:
        Ui::Dialog *ui;
        CashSuper *m_pCashSuper;

    };

    #endif // DIALOG_H

    //--------------------------------------------------

    #include "dialog.h"

    #include "ui_dialog.h"

    Dialog::Dialog(QWidget *parent) :
        QDialog(parent),
        ui(new Ui::Dialog)
    {
        ui->setupUi(this);
        ui->comboBox_aritype->insertItem(0, tr("正常收费"));
        ui->comboBox_aritype->insertItem(1, tr("满100返20"));
        ui->comboBox_aritype->insertItem(2, tr("7.5折"));
        ui->comboBox_aritype->setCurrentIndex(0);

    }

    Dialog::~Dialog()
    {
        delete ui;
    }


    void Dialog::on_pushButton_sure_clicked()
    {
        CashFactory ft;
        double totalprice=0.0;

        m_pCashSuper = ft.CreateCash(ui->comboBox_aritype->currentIndex(), ui->comboBox_aritype->currentText());
        totalprice=ui->lineEdit_price->text().toDouble()*ui->lineEdit_number->text().toUInt();
        totalprice=m_pCashSuper->GetCashResult(totalprice);
        ui->label_totalprice->setText(QString::number(totalprice, 12, 2)+tr("元"));
        ui->textEdit_show->setText(tr("总价=")+ui->label_totalprice->text()+tr("\t类型:")+ui->comboBox_aritype->currentText());

    }

    void Dialog::on_pushButton_reset_clicked()
    {
        ui->lineEdit_number->setText("");
        ui->lineEdit_price->setText("");
        ui->comboBox_aritype->setCurrentIndex(0);
        ui->textEdit_show->setText("");
        ui->label_totalprice->setText("");
    }

    void Dialog::on_comboBox_aritype_activated(QString )    //动态修改
    {
        if(ui->comboBox_aritype->currentIndex()==0)
             ui->comboBox_aritype->setEditable(false);
         ui->comboBox_aritype->setEditable(true);
    }

    //--------------------------------------------------

    #include <QtGui/QApplication>
    #include "dialog.h"
    #include <qtextcodec.h>

    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        QTextCodec::setCodecForTr(QTextCodec::codecForName("gb2312"));
        Dialog w;
        w.show();

        return a.exec();
    }


    //策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的相同的工作,只是实现不同,
    //它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合,

  • 相关阅读:
    bzoj 1176 cdq分治套树状数组
    Codeforces 669E cdq分治
    Codeforces 1101D 点分治
    Codeforces 1100E 拓扑排序
    Codeforces 1188D Make Equal DP
    Codeforces 1188A 构造
    Codeforces 1188B 式子转化
    Codeforces 1188C DP 鸽巢原理
    Codeforces 1179D 树形DP 斜率优化
    git commit -m "XX"报错 pre -commit hook failed (add --no-verify to bypass)问题
  • 原文地址:https://www.cnblogs.com/ccmfc/p/1926144.html
Copyright © 2011-2022 走看看