策略模式(附Head First策略模式的C++代码实现)
2015-04-10 00:42
756 查看
当你看到文章标题的时候,一般就知道了什么事策略模式,不过我还是要啰嗦一下,那么,先给出策略模式的定义吧。
策略模式:软件设计模式的一种,策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
问题:
一个模拟鸭子的游戏,即有各种各样的鸭子,具有不同的行为,有的鸭子可以飞,有的不可以飞,并且叫声也不同,还有不会叫的鸭子。
如果不知道策略模式的话,那么我们大约有两种比较容易想到的方法来解决这个问题:
1.写一个鸭子的基类,但是这样做的缺点很明显,那就是我们需要每一只鸭子类都必须覆盖基类的函数(方法)。
2.使用接口(C++还没有接口- -!),这样做的缺点就是每一只鸭子类中都要写对应的方法,并且不容易更改。
于是,这里就用到了策略模式,定义FlyBehavior与QuackBehavior行为接口,并且用这两个接口定义两个变量作为基类的成员变量,而我们创造一组具体的行为类来实现FlyBehavior与QuackBehavior接口,这样,我们就可以让鸭子的某个成员变量(两个接口类型的)来调用每个鸭子对应的方法,这样我们大大减少了代码量,而且使得鸭子改变行为成为了可能(比如本来呱呱叫,突然得病哑了)。
代码较多,知道有些人不喜欢看冗长的文章,于是我决定把代码放到文章最后的链接里,需要的可以去下载,代码不多,命名也比较规范,看起来应该很容易明白。
那接着说策略模式吧,先放一张uml图:
设计原则:
代码封装,即相同的代码要独立出来。
针对接口编程。
多用组合,少用继承
优缺点:
优点:
1. 策略模式提供了管理相关的算法族的办法。
2. 策略模式提供了可以替换继承关系的办法。
3. 使用策略模式可以避免使用多重条件转移语句。
缺点:
1.客户端必须知道所有的策略类。
2.策略模式造成很多的策略类。
具体请看百度百科策略模式,感觉总结的优缺点还不错。
最后,给出一段很短的Java代码实现最简单的策略模式(不想看的请无视- -!):
下载地址:http://download.csdn.net/detail/u013679882/8579757;
欢迎指出不足
策略模式:软件设计模式的一种,策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
问题:
一个模拟鸭子的游戏,即有各种各样的鸭子,具有不同的行为,有的鸭子可以飞,有的不可以飞,并且叫声也不同,还有不会叫的鸭子。
如果不知道策略模式的话,那么我们大约有两种比较容易想到的方法来解决这个问题:
1.写一个鸭子的基类,但是这样做的缺点很明显,那就是我们需要每一只鸭子类都必须覆盖基类的函数(方法)。
2.使用接口(C++还没有接口- -!),这样做的缺点就是每一只鸭子类中都要写对应的方法,并且不容易更改。
于是,这里就用到了策略模式,定义FlyBehavior与QuackBehavior行为接口,并且用这两个接口定义两个变量作为基类的成员变量,而我们创造一组具体的行为类来实现FlyBehavior与QuackBehavior接口,这样,我们就可以让鸭子的某个成员变量(两个接口类型的)来调用每个鸭子对应的方法,这样我们大大减少了代码量,而且使得鸭子改变行为成为了可能(比如本来呱呱叫,突然得病哑了)。
代码较多,知道有些人不喜欢看冗长的文章,于是我决定把代码放到文章最后的链接里,需要的可以去下载,代码不多,命名也比较规范,看起来应该很容易明白。
那接着说策略模式吧,先放一张uml图:
设计原则:
代码封装,即相同的代码要独立出来。
针对接口编程。
多用组合,少用继承
优缺点:
优点:
1. 策略模式提供了管理相关的算法族的办法。
2. 策略模式提供了可以替换继承关系的办法。
3. 使用策略模式可以避免使用多重条件转移语句。
缺点:
1.客户端必须知道所有的策略类。
2.策略模式造成很多的策略类。
具体请看百度百科策略模式,感觉总结的优缺点还不错。
最后,给出一段很短的Java代码实现最简单的策略模式(不想看的请无视- -!):
//StrategyExample test application class StrategyExample { public static void main(String[] args) { Context context; // Three contexts following different strategies context = new Context(new FirstStrategy()); context.execute(); context = new Context(new SecondStrategy()); context.execute(); context = new Context(new ThirdStrategy()); context.execute(); } } // The classes that implement a concrete strategy should implement this // The context class uses this to call the concrete strategy interface Strategy { void execute(); } // Implements the algorithm using the strategy interface class FirstStrategy implements Strategy { public void execute() { System.out.println("Called FirstStrategy.execute()"); } } class SecondStrategy implements Strategy { public void execute() { System.out.println("Called SecondStrategy.execute()"); } } class ThirdStrategy implements Strategy { public void execute() { System.out.println("Called ThirdStrategy.execute()"); } } // Configured with a ConcreteStrategy object and maintains a reference to a Strategy object class Context { Strategy strategy; // Constructor public Context(Strategy strategy) { this.strategy = strategy; } public void execute() { this.strategy.execute(); } }
下载地址:http://download.csdn.net/detail/u013679882/8579757;
欢迎指出不足
相关文章推荐
- Head First 设计模式 C++实现-Strategy(策略模式)
- Head First 设计模式 C++实现-Strategy(策略模式)
- Head First 设计模式 (一) 策略模式(strategy pattern) C++实现
- 《大话设计模式》读书笔记(C++代码实现) 第二章:策略模式
- HEAD_FIRST设计模式学习 ----策略模式 c++简单实现代码
- Head First 设计模式 C++实现-Strategy(策略模式)
- 《大话设计模式》读书笔记(C++代码实现) 第二章:策略模式
- 《Head First 设计模式》例子的C++实现(1 策略模式)
- 《Head First 设计模式》例子的C++实现(1 策略模式)
- 策略模式及C++实现
- 设计模式:策略模式的实现 c++ 与 java
- 设计模式C++实现(2)——策略模式
- C++之设计模式实现代码
- 设计模式系列1-----C++实现策略模式(Strategy)
- 用C++实现设计模式中的策略模式
- Singleton模式的C++实现研究(示例代码)
- 设计模式C++实现(2)——策略模式
- 设计模式之C++实现(二)---策略模式(Strategy)
- C++实现策略(Strategy)模式
- [设计模式]head first 设计模式之PHP实现 第一章 练习题代码