您的位置:首页 > 其它

第二章 策略模式

2008-11-13 13:41 218 查看
界面部分使用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使用工厂方法类生成每个算法的类。现在就能理解到这里了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: