学习head first 设计模式之策略模式

来源:互联网 发布:wap淘宝流量来源 编辑:程序博客网 时间:2024/05/18 16:54

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

简单的模拟鸭子应用做起: 超类DUCK存在鸭子的行为


随着业务需求的增加 可能会增加让鸭子飞的行为,我们可以直接在超类增加抽象方法fly(); 然后实现类去实现这个方法 这样就可以飞了,但是这样会造成后面的隐患,比如增加需求有个橡胶鸭子的实现类是不需要飞的操作的,后面再有其他的实现类的增加 ,造成代码在多个子类中重复,改变会造成其他鸭子不想要的改变,运行时的行为不容易改变。

这样就根据前人总结的经验设计原则:找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混淆在一起。

为了让代码有弹性,让鸭子的行为动态的改变,在运行时动态的改变鸭子的飞行行为。

这样通过第二个设计原则:针对接口编程,而不是针对实现编程

以前的做法是:行为来之duck超类的具体实现,或是继承某个接口并由子类自行实现。这两种做法都是依赖于“实现”,要想改变行为需要写更多的代码 不利于后期的代码维护。

在策略模式中:鸭子的子类将使用接口(flybehavior与quackbehavior)所表示的行为,所以实际的实现编写在flybehavior与quackbehavior的类中。


duck超类代码:


package headfirst.designpatterns.strategy;public abstract class Duck {FlyBehavior flyBehavior;QuackBehavior quackBehavior;public Duck() {}public void setFlyBehavior(FlyBehavior fb) {flyBehavior = fb;}public void setQuackBehavior(QuackBehavior qb) {quackBehavior = qb;}abstract void display();public void performFly() {flyBehavior.fly();}public void performQuack() {quackBehavior.quack();}public void swim() {System.out.println("All ducks float, even decoys!");}}

quackbehacior接口:

package headfirst.designpatterns.strategy;public interface QuackBehavior {public void quack();}

flybehavior接口:

package headfirst.designpatterns.strategy;public interface FlyBehavior {public void fly();}
鸭子DecoyDuck实现类:

package headfirst.designpatterns.strategy;public class DecoyDuck extends Duck {public DecoyDuck() {setFlyBehavior(new FlyNoWay());setQuackBehavior(new MuteQuack());}public void display() {System.out.println("I'm a duck Decoy");}}

鸭子modelduck实现类:

package headfirst.designpatterns.strategy;public class ModelDuck extends Duck {public ModelDuck() {flyBehavior = new FlyNoWay();quackBehavior = new Quack();}public void display() {System.out.println("I'm a model duck");}}

测试类:

package headfirst.designpatterns.strategy;public class MiniDuckSimulator {        public static void main(String[] args) {                DecoyDuck decoy = new DecoyDuck();                Duck model = new ModelDuck();                decoy.performQuack();                model.performFly();        model.setFlyBehavior(new FlyRocketPowered());        model.performFly();    }}

以上代码均来自head first网站 建议看从head first书籍学习 讲的很生动

个人对此模式理解为 将组合代替继承 使代码更有弹性


阅读全文
0 0