策略模式(Strategy Pattern)

来源:互联网 发布:剑灵捏脸数据图人男 编辑:程序博客网 时间:2024/05/29 16:49
  • 先从一个例子说起….
    首先有一个系统内部设计使用了标准的OO技术,设计了一个鸭子超类(superclass)。并让各种鸭子继承此超类。

这里写图片描述

    产品经理提出了新的需求,引入了会飞的鸭子....,对于一个OO程序员来说,这有什么困难的了,只要在鸭子超类    (Duck)中加入fly()方法就可以了。可是这样的话,所有的鸭子就都会飞了...,可以在不需要飞行的鸭子子类中    重写fly()方法...,这样也是可以的,只是如果不会飞的鸭子子类有50多个,这样就需要在50多个类中重写    fly()方法了,这样的设计显然不是合理的。
    对于这样的问题,可以将fly()方法从鸭子超类中抽取出来,单独写一个接口Flyable.

这里写图片描述

    在这里,只考虑两种情况,会飞和不会飞,写两个子类继承Flyable接口,实现fly()方法。

这里写图片描述

    以前的做法是:行为来自Duck类的具体实现,这种做法太依赖于"实现",我们被实现绑的死死的,没办法更改行为。    在新的设计中,将使用鸭子的子类所表示的行为,这样就不会被"实现"绑死。    来看下重新设计的Duck类

这里写图片描述

    让Duck持有Flyable接口,加入performFly()和setFlyable(Flyable fly)方法    performFly(){        flyAble.fly();//调用接口中的fly()方法    }    setFlyable(Flyable fly){        this.flyAble = fly;//这样就可以动态的设置Flyable类的具体实现子类了,对于父类来说这是透明的    }
    再看下现在的鸭子子类的实现 

这里写图片描述

    这样将行为委托给flyAble来处理,同时加入的setFlyable(Flyable fly)方法可以动态改变行为    GreenDuck duck = new GreenDuck();    duck.performFly();//飞行    duck.setFlyable(new FlyNoWay());    duck.performFly();//不会飞行
     这就是策略模式,定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
0 0
原创粉丝点击