买的第一本head first 系列的书---Head First Design Patterns 终于开始看了,今天看完了第一个模式:Strategy Pattern:定义的算法簇,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户端.
书中的例子挺经典的,看完这一章后,把书中的例子自己写了遍,练习了策略模式的使用,下面是代码:
鸭子类,有会飞,会叫等一系列行为:
package pro.pattern.strategy.example.duck; import pro.pattern.strategy.example.duck.flybehavior.FlyBehavior; import pro.pattern.strategy.example.duck.quackbehavior.QuackBehavior; public abstract class Duck { FlyBehavior flyBehavior; QuackBehavior quackBehavior; public Duck(){ } public abstract void display() ; public void performFly() { flyBehavior.fly(); } public void performQuack(){ quackBehavior.quack(); } public void setFlyBehavior(FlyBehavior fly){ flyBehavior = fly; } public void setQuackBehavior(QuackBehavior quack){ quackBehavior = quack; } }
由于鸭子的种类很多(橡皮鸭,真鸭等,)其飞行,叫的行为不尽相同,可以将飞行和叫声分别定义为算法簇:
飞行行为:
//封装飞行行为
package pro.pattern.strategy.example.duck.flybehavior; public interface FlyBehavior { public void fly(); } package pro.pattern.strategy.example.duck.flybehavior; public class FlyNoWay implements FlyBehavior { @Override public void fly() { System.out.println("I can't fly!"); } } package pro.pattern.strategy.example.duck.flybehavior; public class FlyWithWings implements FlyBehavior{ @Override public void fly() { System.out.println("I'm flying!"); } }
叫声行为:
package pro.pattern.strategy.example.duck.quackbehavior; public interface QuackBehavior { public void quack(); } package pro.pattern.strategy.example.duck.quackbehavior; public class Quack implements QuackBehavior { @Override public void quack() { System.out.println("Quack"); } } package pro.pattern.strategy.example.duck.quackbehavior; public class MuteQuack implements QuackBehavior { @Override public void quack() { System.out.println("Mute Quack"); } } package pro.pattern.strategy.example.duck.quackbehavior; public class Squack implements QuackBehavior { @Override public void quack() { System.out.println("Squack"); } }
定义完算法簇后,就可以定义一个具体的鸭子(duck)类:
package pro.pattern.strategy.example.duck; import pro.pattern.strategy.example.duck.flybehavior.FlyNoWay; import pro.pattern.strategy.example.duck.quackbehavior.Squack; public class ModelDuck extends Duck { @Override public void display() { System.out.println("Just a strategy pattern demo!"); } public ModelDuck () {//用组合,不用继承 flyBehavior = new FlyNoWay(); quackBehavior = new Squack(); } }
测试:
package pro.pattern.strategy.example.duck;
import pro.pattern.strategy.example.duck.flybehavior.FlyWithWings;
import pro.pattern.strategy.example.duck.quackbehavior.MuteQuack;
public class Test {
public static void main(String[] args){
Duck duck = new ModelDuck();
duck.performFly();
duck.performQuack();
//运行时动态设定行为
duck.setFlyBehavior(new FlyWithWings());
duck.setQuackBehavior(new MuteQuack());
duck.performFly();
duck.performQuack();
}
}
在书中学到的设计原则:
封装变化
多用组合,少用继承