0. 前言
最近在重构公司的一个项目的时候,在抽取DES加密重复部分代码的时候,突然间想起了策略模式,感觉策略模式好像可以应用上,于是重新学习了下策略模式。注:在DES加密中,有DES和TDES算法,其中又有各种分组模式,如EBC,CBC等。
1. 定义
引用百度定义:策略模式,定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
2. 应用
这里的例子参考了《Head First Design Pattern》中的游戏角色装备切换的例子。
在角色游戏中,每个角色都可以切换武器,这里,对于程序来说,武器是变化的,将武器隔离开,角色只保留着一个武器槽即可。
如下UML图:
示例程序:
角色基类:
package StrategyPattern; public abstract class Character { private Weapon weapon; public void setWeapon(Weapon weapon) { this.weapon = weapon; } public void fight( ) { weapon.useWeapon(); } }
具体角色(国王):
package StrategyPattern; public class King extends Character { public King( Weapon weapon ) { setWeapon(weapon); } public King( ) { setWeapon( new Sword() ); } }
武器接口:
1 package StrategyPattern; 2
3 public interface Weapon { 4 void useWeapon(); 5 }
具体武器:
1 package StrategyPattern; 2
3 public class Sword implements Weapon { 4
5 @Override 6 public void useWeapon() { 7 System.out.println( "Use Sword to fight" ); 8 } 9 }
1 package StrategyPattern; 2
3 public class Knife implements Weapon { 4
5 @Override 6 public void useWeapon() { 7 System.out.println( "Use knife to fight" ); 8 } 9
10 }
运行实例:
1 package StrategyPattern.test; 2
3 import org.junit.Test; 4
5 import StrategyPattern.King; 6 import StrategyPattern.Knife; 7
8 public class TestKing { 9
10 @Test 11 public void test() { 12 King king = new King(); 13 king.fight(); 14
15 king.setWeapon( new Knife() ); 16 king.fight(); 17 } 18
19 }
运行结果:
3. 总结
个人认为,对于策略模式,其实不仅仅局限于OOAP,对于C的一些场景来说也是适合的,例如DES加密算法中,有DES和TDES,这时函数接口原型一样,将DES和TDES算法分别封装在一个函数中,通过定义一个函数指针来实现调用。