第二章 策略模式

 界面部分使用QT完成。下面先是源代码
cash.h:


#ifndef CASH_H
#define CASH_H
class Cash
{
    public:
        virtual double getAfter(double beforeTotal) = 0;
};


class NormalCash :public Cash
{
    public:
        NormalCash();
        virtual double getAfter(double beforeTotal);
};
class DiscountCash :public Cash
{
    public:
        DiscountCash(double discount);
        virtual double getAfter(double beforeTotal);
    private:
        double _discount;
};
class ReturnCash :public Cash
{
    public:
        ReturnCash(double returnStard, double returnMount);
        virtual double getAfter(double beforeTotal);
    private:
        double _returnStard;
        double _returnMount;
};
#endif


cash.cpp:
#include "cash.h"
NormalCash::NormalCash()
{
}
double NormalCash::getAfter(double beforeTotal)
{
    return beforeTotal;
}

DiscountCash::DiscountCash(double discount)
{
    _discount = discount;
}
double DiscountCash::getAfter(double beforeTotal)
{
    return beforeTotal * _discount;
}

ReturnCash::ReturnCash(double returnStard, double returnMount)
{
    _returnStard = returnStard;
    _returnMount = returnMount;
}
double ReturnCash::getAfter(double beforeTotal)
{
    if (beforeTotal > _returnStard)
    {
        return (beforeTotal - (((int)(beforeTotal/_returnStard)) * _returnMount));
    }
    else
    {
        return beforeTotal;
    }
}

contextcash.h:


#ifndef CONTEXTCASH_H
#define CONTEXTCASH_H
#include "cash.h"
#include <QString>
class ContextCash
{
    public:
        ContextCash(int cashType);
        ~ContextCash();
        inline double getResult(double memory){return cashRoot->getAfter(memory);}
    private:
        Cash *cashRoot;
};
#endif


contextcash.cpp:

#include "contextcash.h"
ContextCash::ContextCash(int cashType):cashRoot(NULL)
{
    switch(cashType)
    {
        case 0:
            cashRoot = new NormalCash;
            break;
        case 1:
            cashRoot = new DiscountCash(0.8);
            break;
        case 2:
            cashRoot = new DiscountCash(0.3);
            break;
        case 3:
            cashRoot = new ReturnCash(100, 10);
            break;

    };
}

界面文件:market.h

#ifndef MARKET_H
#define MARKET_H
#include <QWidget>
#include "ui_market.h"
class Market : public QWidget
{
    Q_OBJECT
    public:
        Market(QWidget *parent = 0);
        ~Market();
    protected Q_SLOTS:
        void on_ok_clicked();
        void on_reset_clicked();
    private:
        Ui::Market ui;
        double total;
};
#endif


market.cpp:


#include "market.h"
#include <QDebug>
#include "contextcash.h"
Market::Market(QWidget *parent):QWidget(parent),total(0.0)
{
        QIntValidator *intVal = new QIntValidator(0, 1000, this);
        QDoubleValidator *doubleVal = new QDoubleValidator(0, 10000, 2, this);
        doubleVal -> setNotation(QDoubleValidator::StandardNotation);
    ui.setupUi(this);
    ui.price->setValidator(doubleVal);
    ui.count->setValidator(intVal);
}

void Market::on_ok_clicked()
{
    int cashType = ui.discount->currentIndex();
    ContextCash contextC(cashType);
    double thisTime = contextC.getResult((ui.price->text().toDouble()) * (ui.count->text().toInt()));
    total = total + thisTime;
    ui.total->setText(QString("%1").arg(total, 0, 'f', 2));
//    ui.detail->append(QString::fromLocal8Bit("单价")+QString("数量")+QString("方式")+QString("小计")); for display chinese character.
//
    ui.detail->append(tr("price:")+ui.price->text()+"  "+tr("count:")+ui.count->text()+"  "+tr("type:")+QString().setNum(cashType)+"  "+tr("total:")+QString().setNum(thisTime));

}
void Market::on_reset_clicked()
{
    ui.price->setText("0.0");
    ui.count->setText("1");
}
Market::~Market(){}
使用了ui设计。就上传一个图片好了
main.cpp:

#include <QtGui>
#include <QTranslator>
#include "market.h"
#include <QLocale>
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QTranslator translator;
    translator.load("market_CN");//translator.load("market"+QLocale::system().name());
    app.installTranslator(&translator);
    qDebug() << QLocale::system().name();
    Market *mainWidget = new Market;
    mainWidget -> show();
    return app.exec();
}

在上面的程序中还使用了全球化和输入限制的一些类。
Strategy策略模式是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类.
我的理解就是要做一个事情或者是要得到最终的结果,可以有很多的方法,每个方法的行为还不一样,那么我们就每一个方式一个类,让后让令一个context类去管理他们,对于端根本就看不见straegy类,strategy使用工厂方法类生成每个算法的类。现在就能理解到这里了。







你可能感兴趣的:(第二章 策略模式)