0
点赞
收藏
分享

微信扫一扫

【设计模式2】策略模式

罗蓁蓁 2023-04-11 阅读 106


要点总括

(1) Strategy 类:定义所有支持的算法的公共接口,用纯虚函数定义抽象算法接口;
(2) ConcreteStategy 类簇:封装了具体的算法或行为,继承自Strategy,各种策略的具体实现;
(3) Context 类,持有一个策略类的引用,传入具体的ConcreteStategy来配置,最终给客户端调用。

脑图展开

【设计模式2】策略模式_Qt

核心代码实现(Qt,C++)

(1)基本功能实现,未考虑任何封装特性

void Widget::calPrice()
{
    double unitPrice=ui->unitEdit->text().toDouble();
    double nums=ui->numEdit->text().toDouble();
    double sum=unitPrice*nums;
    totlPrict+=sum;
    QString str=QString("单价:%1,数量:%2,合计:%3").arg(unitPrice).arg(nums).arg(sum);
    ui->showEdit->append(str);
    ui->showLabel->setText(QString::number(totlPrict));
    qDebug()<<"单价:"<<unitPrice;

}

(2)简单工厂模式实现,充分考虑继承及多态

//价格计算
void Widget::calPrice()
{

    double unitPrice=ui->unitEdit->text().toDouble();
    double nums=ui->numEdit->text().toDouble();

    CashCharge *currCharge=CrashFactory::createCashAccept(ui->discountBox->currentIndex());
    double sum=currCharge->acceptCash(unitPrice*nums);

    totlPrict+=sum;
    QString str=QString("单价:%1,数量:%2,合计:%3").arg(unitPrice).arg(nums).arg(sum);
    ui->showEdit->append(str);
    ui->showLabel->setText(QString::number(totlPrict));
    delete currCharge;
    //qDebug()<<"单价:"<<unitPrice;
}

//收费类及收费子类
class CashCharge
{
public:
    CashCharge();
    virtual double acceptCash(double money)=0;
};
class CashNormal:public CashCharge{//正常收费
public:
    double acceptCash(double money);
};

class CashRebate:public CashCharge{
public:
    CashRebate(QString str);
    double acceptCash(double money);

private:
    double moneyRebate=1.0;
};

class CashReturn:public CashCharge{
public:
    CashReturn(QString str1,QString str2);
    double acceptCash(double money);
private:
    double moneyCondition=0.0;
    double moneyReturn=0.0;


};

//简单工厂类
CashCharge *CrashFactory::createCashAccept(int flag)
{
    CashCharge* currCharge=nullptr;
    switch (flag) {
    case 0://正常收费
        currCharge=new CashNormal();break;
    case 1://满300返100
        currCharge=new CashReturn(QString("300"),QString("100"));break;
    case 2://打八折
        currCharge=new CashRebate(QString("0.8"));break;
    }
    return currCharge;
}

(3)策略模式(与简单工厂模式结合)

//价格计算(用户界面)
void Widget::resertPrice()
{
    totlPrict=0;
    ui->unitEdit->setText(QString::number(0));
    ui->numEdit->setText(QString::number(0));
    ui->showEdit->setPlainText(""); // 清空内容
    ui->showLabel->setText(QString::number(totlPrict));
}

//收费类及收费子类
略,同简单工厂

//上下文类
CashContext::CashContext(int flag)
{
   // CashContext* curCharge=nullptr;
    switch (flag) {
        case 0://正常收费
            currCharge=new CashNormal();break;
        case 1://满300返100
            currCharge=new CashReturn(QString("300"),QString("100"));break;
        case 2://打八折
            currCharge=new CashRebate(QString("0.8"));break;

    }
}
CashContext::~CashContext()
{
    delete currCharge;
}
double CashContext::GetResult(double money)
{
    return currCharge->acceptCash(money);
}

Qt效果展示

【设计模式2】策略模式_子类_02

代码链接

code



举报

相关推荐

0 条评论