策略模式(Strategy):定义了方法族,分别封装起来,让它们之间可以互相替换,让算法的变化独立于使用算法的客户。
1.
——使用标准的OO技术,设计鸭子超类Duck,并让各种鸭子继承此超类
——所有鸭子会呱呱叫Quack,会游泳Swim
——每个鸭子外观不同,display方法抽象
2.
a)
——并非所有子类都会飞:涉及“维护”时,不能为了“复用”目的使用继承
——代码再多个子类中重复,很难知道所有鸭子的全部行为,运行时行为不容易改变,改变会牵一发动全身
b)
——解决 不会再有会飞的橡皮鸭,造成 代码无法复用
c)
1/ 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起;
2/ 针对接口编程,而不是针对实现编程;Animal a = new Dog();Dog d = new Dog();
3/ 多用组合,少用继承
——特定的具体行为编写在实现了FlyBehavior与QuakcBehavior类中
——以前:行为来自超类的具体实现,或继承某个接口并由子类自行实现
3.
——飞行和呱呱叫的动作“委托”别人处理
——Duck类中“加入两个实例变量”,声明为接口类型,动态设置变量运行时引用正确的行为类型
4.
例子:
国王king,皇后queen,骑士knight,妖怪troll都是具体的角色character,他们分别用具体的武器weapon,SwordBehavior宝剑挥舞,匕首刺杀KnifeBehavior,斧头砍杀AxeBehavior,弓箭射击BowAndArrowBehavior,进行打斗fight()