美文网首页
设计模式之策略模式

设计模式之策略模式

作者: shenyoujian | 来源:发表于2018-07-18 17:46 被阅读4次

    一、问题:

    为了复用而使用继承可以看出并不好,因为模型鸟是不能飞的


    image.png

    二、解决:

    解决方法一:子类覆盖父类,问题一旦子类一多,每个子类都得去重写,这可是体力活了。
    image.png
    解决方法二:利用接口,将fly()放在接口里,但是这样每一种会飞的鸟都得去实现这个接口,造成代码无法复用。

    三、使用策略模式

    设计原则一:找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。

    假设Bird类中fly和quack会随着鸟的不同改变,所以根据设计原则一,我们可以把这两个方法从Bird中取出来,并且分开设计建立一组新的类来代表每个行为。例如定义FlyWithWings,FlyNoWay,Quack,MuteQuack,Squeak(会飞,不会飞,不同叫声的类等等,注意是一组)

    image.png
    设计原则二:针对接口编程,而不是针对实现编程。

    有了原则一之后,Bird父类的可以这样写

    void performFly(FlyNoWay f) {
      f.fly();
    }
    

    这样ModelBird就可以调用这个方法performFly(new FlyNoWay()),那么解决模型鸟不会飞,但是现在突然想知道真鸟的飞行情况,Bird类就得重载一个针对会飞的鸟的方法,这样原来的方法就无法复用,因为你在原来的方法里写死了只能是FlyNoWay或者修改原来的performFly()方法,还有曾经所有调用过performFly()方法的也需要进行相应的修改,可见这种设计维护起来也很差劲。所以这时候就出现针对接口编程


    image.png
    设计原则三:多用组合,少用继承

    组合是一种has-a的关系,就是一个类中有另一个类的引用,通过这个引用可以动态改变行为


    image.png

    四、实现

    image.png
    image.png
    image.png

    五、总结

    1、封装变化
    2、多用组合,少用继承
    3、针对接口编程,不针对实现编程
    4、策咯模式:定义系列算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

    相关文章

      网友评论

          本文标题:设计模式之策略模式

          本文链接:https://www.haomeiwen.com/subject/xpwopftx.html