策略模式的优缺点:
优点:
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; }