《Head First设计模式》笔记整理...欢迎交流...算法
定义了算法簇,分别封装起来,让他们之间能够 相互替换,此模式让算法的变化独立于使用算法的客户。
这里稍微提醒一下,策略模式是咱们学习的第一个模式,理解它仍是很是重要的。这个模式跟后面讲到的 模板模式 有些类似的地方,我在学习的时候,看到模板模式已经忘记什么是策略模式了,看的一脸懵逼。不过不要紧,后面我会针对这两个进行整理,这里要记住的是,策略模式封装了一组能够互换的算法簇,是针对接口编程的。编程
为何要封装变化?先来看下面的例子。设计模式
dock类是全部鸭子的超类,其中,飞行(fly)行为和呱呱叫(quack)行为会随着鸭子的不一样而改变。若是咱们不区分变化,将全部的行为定义在超类里。如图:学习
显而易见的,这种设计会致使测试
为了便于之后能够轻易地改动和扩展此部分,而不会影响不须要改变的其它部分,咱们把变化的部分取出并封装起来。spa
使用继承如何?设计一个flyable接口和一个quackable接口。设计
哇,一堆重复的代码,并且代码难以复用。甚至在会飞的鸭子中,飞行的动做也多是变幻无穷的。若是咱们想要更加弹性一点,在运行时也能够动态地选择行为,该怎么办呢?code
针对接口编程,而不是针对实现编程。这里所谓的“接口”有多个含义,接口能够是一个“概念”。”针对接口变成“,关键就在于“多态”,能够更明确地说,变量的声明类型应该是超类型。这也意味着,声明类是没必要理会之后执行时的真正的对象类型。orm
如此,鸭子的行为被放在分开的类中,此类专门提供行为的接口实现。
这样,鸭子类就再也不须要知道行为的实现细节。对象
当你讲两个类结合起来使用,就是组合。如图本列,将飞行行为和呱呱叫行为委托给FlyBehavior和QuackBehavior代为处理。组合创建系统有很大的弹性,不只可将算法簇封装成类,更能够在运行时动态地改变行为,只要组合的行为对象符合正确的接口便可。
publick abstract class Duck { //为行为接口类型声明两个引用变量,全部鸭子子类都继承它们 FlyBehavior flyBehavior; QuackBehavior quackBehavior; public Duck() { } publick abstract void display(); public void performFly() { flyBehavior.fly(); //委托行为给类 } public void performQuack() { quackBehavior.quack(); //委托行为给类 } public viod setFlyBehavior(FlyBehavior fb) { flyBehavior = fb; //动态设定飞行行为 } public viod setQuackBehavior(QuackBehavior qb) { quackBehavior = qb; //动态设定呱呱叫行为 } } ----------------------------------------------------------- public interface FlyBehavior { public void fly(); } public class FlyWithWings implements FlyBehavior { public viod fly() { System.out.printIn("I'm flying!"); } } public class FlyNoWay implements FlyBehavior { public void fly { System.out.printIn("I can't fly!"); } } ----------------------------------------------------------- public class QuackBehavior { public void quack(); } public class Quack implements QuackBehavior { public void quack() { //此处省略 } } public class MuteQuack implements QuackBehavior { public void quack() { //此处省略 } } public class Squack implements QuackBehavior { public void quack() { //此处省略 } }
//制造一个新的鸭子类型:模型鸭 public class ModelDuck extends Duck { public ModelDuck() { flyBehavior = new FlyNoWay(); quackBehavior = new Quack(); } public viod display () { System.out.printIn("I'm a model duck"); } } -------------------------------------------------------- //新建一个新的FlyBehavior类型 public class FlyRocketPowered implements FlyBehavior{ public viod fly() { System.out.printIn("I'm flying with a rocket!"); } }
最后,来看看一个简单的测试
Duck model = new ModelDuck(); model.performFly(); // i can't fly! model.setFlyBehavior(new FlyRocketPowered()); //动态改变行为 model.performFly(); // I'm flying with a rocket!
若是咱们再也不把鸭子的行为看作“一组行为”,而是想成是“一簇算法”,将这些算法抽离并封装起来,委托给对象,经过组合实现运行时算法互换,这就是策略模式。
好了,你以为个人整理如何呢?若是有什么理解不对的地方,或者你有更好的想法欢迎交流。