策略模式的优缺点:
优点:
1.策略模式提供了对“开闭原则”的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活的增加新的算法或行为
2.使用策略模式可以避免多重条件选择语句。
3.策略模式提供了一种算法的复用机制。由于将算法单独提取出来封装在策略类中,因此不同的环境类可以方便地复用这些策略类。
缺点:
1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类。(也就是说策略模式只实用与客户端知道所有算法或行为的情况)
2.策略模式将造成系统产生很多具体策略类,任何细小的变化都将导致系统要新增一个具体策略类。
#include <iostream>
using namespace std;
class AbstractStratgy
{
public:
virtual void useWeapon() = 0;
};
class KinfeStratgy :public AbstractStratgy
{
public:
virtual void useWeapon()
{
cout<<"使用匕首攻击"<<endl;
}
};
class Ak47Stratgy :public AbstractStratgy
{
public:
virtual void useWeapon()
{
cout<<"使用AK47攻击"<<endl;
}
};
class Hero
{
public:
void setStrategy(AbstractStratgy* stratgy)
{
this->stratgy = stratgy;
}
void fight()
{
cout<<"---开始战斗---"<<endl;
stratgy->useWeapon();
}
private:
AbstractStratgy* stratgy;
};
int main()
{
AbstractStratgy* k = new KinfeStratgy;
AbstractStratgy* a = new Ak47Stratgy;
Hero* hero = new Hero;
cout<<"远程小兵来了,使用近身武器"<<endl;
hero->setStrategy(k);
hero->fight();
cout<<"------------------------"<<endl;
cout<<"近战小兵来了,使用远程攻击"<<endl;
hero->setStrategy(a);
hero->fight();
return 0;
}
#include <iostream>
using namespace std;
//抽象的策略
class SellAbstractStrategy
{
public:
//通过商品的原件 返回一个新的 价格
virtual double getPrice(double price) = 0;
};
//无条件打八折
class SellStrategyA :public SellAbstractStrategy
{
public:
virtual double getPrice(double price) {
return price * 0.8;
}
};
//如果满200 减100
class SellStrategyB :public SellAbstractStrategy
{
public:
virtual double getPrice(double price) {
if (price > 200) {
price -= 100;
}
return price;
}
};
class Item {
public:
Item(string name, double price) {
this->name = name;
this->price = price;
}
//更换策略的 方法
void setStrategy(SellAbstractStrategy * strategy) {
this->sellStrategy = strategy;
}
//返回商品的价格
double getPrice() {
return this->sellStrategy->getPrice(this->price);
}
private:
SellAbstractStrategy *sellStrategy; //一个销售的策略
string name;
double price;
};
int main(void)
{
Item it("屌丝鞋", 250);
SellAbstractStrategy *sa = new SellStrategyA;
SellAbstractStrategy *sb = new SellStrategyB;
cout << "上午 执行策略A销售, " << endl;
it.setStrategy(sa);
cout << it.getPrice() << endl;
cout << "-----" << endl;
cout << "下午执行策略B销售" << endl;
it.setStrategy(sb);
cout << it.getPrice() << endl;
return 0;
}