设计模式——策略模式

使用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。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值