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


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

原文地址:https://www.cnblogs.com/ccmfc/p/1926144.html