策略模式

来源:互联网 发布:水刀机有什么软件 编辑:程序博客网 时间:2024/06/04 18:49

策略模式(Strategy):定义了方法族,分别封装起来,让它们之间可以互相替换,让算法的变化独立于使用算法的客户。


1.      游戏中出现各种鸭子,一边游泳戏水,一边呱呱叫

——使用标准的OO技术,设计鸭子超类Duck,并让各种鸭子继承此超类

——所有鸭子会呱呱叫Quack,会游泳Swim

——每个鸭子外观不同,display方法抽象

2.      鸭子要会飞

a)        Duck类中加上fly()方法

——并非所有子类都会飞:涉及“维护”时,不能为了“复用”目的使用继承

——代码再多个子类中重复,很难知道所有鸭子的全部行为,运行时行为不容易改变,改变会牵一发动全身

b)       接口Flyable()Quackable()取出flyquark方法

——解决 不会再有会飞的橡皮鸭,造成 代码无法复用

c)        设计原则

1/ 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起;

2/ 针对接口编程,而不是针对实现编程;Animal a = new Dog();Dog d = new Dog();

3/ 多用组合,少用继承

                       i.             取出行为,建立新类FlyBehaviorQuackBehavior

——特定的具体行为编写在实现了FlyBehaviorQuakcBehavior类中

——以前:行为来自超类的具体实现,或继承某个接口并由子类自行实现

3.      整合鸭子行为

——飞行和呱呱叫的动作“委托”别人处理

——Duck类中“加入两个实例变量”,声明为接口类型,动态设置变量运行时引用正确的行为类型

4.      动态设定行为


例子:

国王king,皇后queen,骑士knight,妖怪troll都是具体的角色character,他们分别用具体的武器weaponSwordBehavior宝剑挥舞,匕首刺杀KnifeBehavior,斧头砍杀AxeBehavior,弓箭射击BowAndArrowBehavior,进行打斗fight()