在现实生活中常常遇到实现某种目标存在多种策略可供选择的情况,例如,出行旅游可以乘坐飞机、乘坐火车、骑自行车或自己开私家车等,超市促销可以釆用打折、送商品、送积分等方法。
在软件开发中也常常遇到类似的情况,当实现某一个功能存在多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能,如数据排序策略有冒泡排序、选择排序、插入排序、二叉树排序等。
策略(Strategy)模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。
策略模式的主要优点如下。
其主要缺点如下。
策略模式是准备一组算法,并将这组算法封装到一系列的策略类里面,作为一个抽象策略类的子类。策略模式的重心不是如何实现算法,而是如何组织这些算法,从而让程序结构更加灵活,具有更好的维护性和扩展性,现在我们来分析其基本结构和实现方法。
策略模式的主要角色如下。
其结构图如图 1 所示。
策略模式的实现代码如下:
public class StrategyPattern { public static void main(String[] args) { Context c = new Context(); Strategy s = new ConcreteStrategyA(); c.setStrategy(s); c.strategyMethod(); System.out.println("-----------------"); s = new ConcreteStrategyB(); c.setStrategy(s); c.strategyMethod(); } } //抽象策略类 interface Strategy { public void strategyMethod(); //策略方法 } //具体策略类A class ConcreteStrategyA implements Strategy { public void strategyMethod() { System.out.println("具体策略A的策略方法被访问!"); } } //具体策略类B class ConcreteStrategyB implements Strategy { public void strategyMethod() { System.out.println("具体策略B的策略方法被访问!"); } } //环境类 class Context { private Strategy strategy; public Strategy getStrategy() { return strategy; } public void setStrategy(Strategy strategy) { this.strategy = strategy; } public void strategyMethod() { strategy.strategyMethod(); } }
程序运行结果如下:
具体策略A的策略方法被访问! ----------------- 具体策略B的策略方法被访问!
C++代码:
//抽象策略类 class Strategy { public: virtual void strategyMethod() {} }; //具体策略类A class ConcreteStratrgyA : public Strategy { public: virtual void strategyMethod() { cout << "visit strategy A" << endl; } }; //具体策略类B class ConcreteStrategyB : public Strategy { public: virtual void strategyMethod() { cout << "visit strategy B" << endl; } }; //环境类 class Context { private: Strategy* str_; public: void setStrategy(Strategy* str_) { this->str_ = str_; } void strategyMethod() { str_->strategyMethod(); } }; // int main() { Context* con = new Context; Strategy* str = new ConcreteStratrgyA; con->setStrategy(str); con->strategyMethod(); str = new ConcreteStrategyB; con->setStrategy(str); con->strategyMethod(); cout << ‘a‘; return 0; }
转载自:http://c.biancheng.net/view/1378.html
原文:https://www.cnblogs.com/0patrick/p/14145772.html