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();
    }


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

  • 相关阅读:
    矩阵乘法
    年关了,抛一个模拟ip刷票的php程序
    mysql处理大数据合并的另一种方法
    php之aop实践
    轻量级php框架phpk v1.0发布
    eclipse
    super关键字的使用
    方法的重写
    方法的重载
    java 构造器 (构造方法)
  • 原文地址:https://www.cnblogs.com/ccmfc/p/1926144.html
Copyright © 2011-2022 走看看