策略模式(Strategy)
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.
理解
这里策略与我们平时的意思一致,即可以实现目标的方案集合,在众多方法中选择一种使用.常用于替代if-else,但并非所有情况下都可替代.
优点
可拓展性良好.策略(Strategy)在运行时装载代码,从而解决了有时候支持不使用的方法也是一种性能负担的问题.
缺点
策略类都需要将方法置为public,这导致方法对外暴露,而执行它们是没有意义的.
实现
在购买商品时,常常涉及到折扣,而折扣是多种多样的,每次的折扣选择都不同.也就是说,购买商品这件事是稳定的,选择的折扣是变化的.
失败的设计
#include <iostream>
using namespace std;
#define Discount1 1
#define Discount2 2
#define Discount3 3
class Price {
public:
void getPrice(int choose) {
switch (choose){
case Discount1:
cout << "打八折!" << endl;
break;
case Discount2:
cout << "满200减50!" << endl;
break;
case Discount3:
cout << "买二送一!" << endl;
break;
default:
break;
}
}
};
int main(void) {
Price price;
price.getPrice(Discount2);
system("pause");
return 0;
}
可扩展性很差,对新的情况的补充需要寻找该类并更改其内部方法.
成功的设计
#include <iostream>
using namespace std;
class DiscountStrategy {
public:
virtual void useDiscount() = 0;
virtual ~DiscountStrategy(){}
};
class Discount1 : public DiscountStrategy {
public:
void useDiscount() { cout << "打八折!" << endl; }
};
class Discount2 : public DiscountStrategy {
public:
void useDiscount() { cout << "满200减50!" << endl; }
};
class Discount3 : public DiscountStrategy {
public:
void useDiscount() { cout << "买二送一!" << endl; }
};
class Price {
public:
Price(DiscountStrategy* discount) { m_discount = discount; }
void getPrice() { m_discount->useDiscount(); }
~Price() { delete m_discount; }
private:
DiscountStrategy* m_discount;
};
int main(void) {
Price price(new Discount2);
price.getPrice();
system("pause");
return 0;
}
解决了if-else带来的难以拓展的问题.
下一篇:模板模式