使用QT,新建QWidget工程。
widget.h如下:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QDebug>
namespace Ui {
class Widget;
}
class TaxStrategy {
public:
virtual double Calculate(QVariantMap var) = 0;
virtual ~TaxStrategy();
};
class CnTax : public TaxStrategy {
public:
virtual double Calculate(QVariantMap var);
};
class UsTax : public TaxStrategy {
public:
virtual double Calculate(QVariantMap var);
};
class StrategyFactory {
public:
virtual TaxStrategy* NewStrategy(void) = 0;
virtual ~StrategyFactory();
};
class CnStrategyFactory : public StrategyFactory {
public:
virtual TaxStrategy* NewStrategy(void);
};
class UsStrategyFactory : public StrategyFactory {
public:
virtual TaxStrategy* NewStrategy(void);
};
class Widget : public QWidget {
Q_OBJECT
public:
explicit Widget(StrategyFactory *factory, QWidget *parent = nullptr);
~Widget();
private slots:
void on_pushButton_clicked();
private:
Ui::Widget *ui;
TaxStrategy* m_strategy;
StrategyFactory* m_factory;
};
#endif // WIDGET_H
widget.cpp如下:
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(StrategyFactory *factory,QWidget *parent) : QWidget(parent), ui(new Ui::Widget) {
ui->setupUi(this);
m_factory = factory;
this->m_strategy = m_factory->NewStrategy();
}
Widget::~Widget() {
delete ui;
delete this->m_strategy;
}
TaxStrategy::~TaxStrategy() { }
double CnTax::Calculate(QVariantMap var) {
qDebug()<<"CnTax Calculate";
return 0;
}
double UsTax::Calculate(QVariantMap var) {
qDebug()<<"UsTax Calculate";
return 0;
}
void Widget::on_pushButton_clicked() {
QVariantMap var;
m_strategy->Calculate(var);
}
StrategyFactory::~StrategyFactory() { }
TaxStrategy *CnStrategyFactory::NewStrategy() {
return new CnTax;
}
TaxStrategy *UsStrategyFactory::NewStrategy() {
return new UsTax;
}
main.cpp如下:
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[]){
QApplication a(argc, argv);
CnStrategyFactory* cn = new CnStrategyFactory;
UsStrategyFactory* us = new UsStrategyFactory;
Widget w1(cn);
w1.show();
Widget w2(us);
w2.show();
return a.exec();
}
widget.ui如下:
运行结果如下:
产生两个Widget窗口,分别点击PushButton,会打印不同的信息。
说明:这里使用两个TaxStrategy的子类来计算不用的税法,来适应变化。策略模式与工厂模式非常相似,只是考虑的点不同,策略模式考虑的是接口相同但是方法(算法)不同,方法(算法)会变化。而工厂模式考虑的是生成对象,在当前类中绕开new。