要点总括
(1) Strategy 类:定义所有支持的算法的公共接口,用纯虚函数定义抽象算法接口;
(2) ConcreteStategy 类簇:封装了具体的算法或行为,继承自Strategy,各种策略的具体实现;
(3) Context 类,持有一个策略类的引用,传入具体的ConcreteStategy来配置,最终给客户端调用。
脑图展开
核心代码实现(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效果展示
代码链接
code