策略模式:
当用户需要选择不同的算法或行为时,如果把这些算法或行为写在一个类里,通过判断来选择的话,这个类将变得非常复杂并且难以维护。策略模式就是构造一个抽象类,具体的算法或者行为继承这个类,让用户来选择。这样做的好处是,可以随时增加或者修改行为,即增加、修改算法或行为的类就可以了。
策略模式和简单工厂模式的差别:
简单工厂模式是通过一个抽象类来构造新对象,用户接触不到具体对象。
策略模式是通过抽象类来选择行为或算法。
UML类图:
C++代码实现:
#include <iostream>
#include <string>
class CashSuper
{
public:
CashSuper() = default;
CashSuper(double d) : Money(d) {}
virtual double acceptCash() {
return Money;
}
double Money;
};
class CashNormal : public CashSuper
{
public:
CashNormal() = default;
CashNormal(double d) : CashSuper(d) {}
double acceptCash() override {
return Money;
}
};
class CashDiscount : public CashSuper
{
public:
CashDiscount () = default;
CashDiscount(double d) : CashSuper(d) {}
double acceptCash() override {
return Money * 0.8;
}
};
class CashReturn : public CashSuper
{
public:
CashReturn() = default;
CashReturn(double d) : CashSuper(d) {}
double acceptCash() override {
int i = Money / 100;
return Money - i * 30;
}
};
class CashContext
{
public:
CashSuper cs;
std::string CashName;
CashSuper* getCash(std::istream& in) {
std::cout << " Enter money and n or d or r!" << std::endl;
in >> cs.Money >> CashName;
if (CashName == "n")
return new CashNormal (cs.Money);
if (CashName == " d")
return new CashDiscount (cs.Money);
if (CashName == "r")
return new CashReturn (cs.Money);
}
void showResults() {
CashSuper* cs = getCash(std::cin);
std::cout << cs->acceptCash() << std::endl;
}
};
void main() {
CashContext cc;
cc.showResults();
}
在策略模式的学习过程中,我觉得它和工厂模式很像,难以区别,可能写出来的代码有误,还要再查资料把这两个模式搞清楚。