策略模式定义了算法簇,分别封装起来,让他们可以互相替换,此模式让算法的变化独立于使用算法的使用者。
系统描述:各种不同的鸭子,有的可以飞,有点不可以飞,不同的鸭子叫声也不一定相同。
定义一个鸭子的超类Duck,其他具体的鸭子继承该超类,将鸭子的飞的行为和叫的行为分别封装到接口中
鸭子的超类:
package cn.lan.duck; import cn.lan.duck.behavior.FlyBehavior; import cn.lan.duck.behavior.QuackBehavior; /** * 鸭子的超类 * @author wy * */ public abstract class Duck { //飞行行为的接口 FlyBehavior flyBehavior; //叫声行为的接口 QuackBehavior quackBehavior; public Duck() { } //执行飞行为的方法 public void performFly() { flyBehavior.fly(); } //执行叫行为的方法 public void performQuack() { quackBehavior.quack(); } //执行游泳的方法 public void swim() { System.out.println("all ducks can swim...."); } public void setFlyBehavior(FlyBehavior flyBehavior) { this.flyBehavior = flyBehavior; } public void setQuackBehavior(QuackBehavior quackBehavior) { this.quackBehavior = quackBehavior; } }飞行行为的接口
package cn.lan.duck.behavior; /** * 飞行行为的接口 * @author wy * */ public interface FlyBehavior { public void fly(); }叫声的接口
package cn.lan.duck.behavior; /** * 叫行为的接口 * @author wy * */ public interface QuackBehavior { public void quack(); }具体的实现类
package cn.lan.duck.behavior.impl; import cn.lan.duck.behavior.FlyBehavior; /** * 飞行行为的实现类:不能飞 * @author wy * */ public class FlyNoWays implements FlyBehavior { @Override public void fly() { // TODO Auto-generated method stub System.out.println("can not fly..."); } }
package cn.lan.duck.behavior.impl; import cn.lan.duck.behavior.FlyBehavior; /** * 飞行行为的实现类:能飞 * @author wy * */ public class FlyWithWins implements FlyBehavior { @Override public void fly() { // TODO Auto-generated method stub System.out.println("flying ....."); } }
package cn.lan.duck.behavior.impl; import cn.lan.duck.behavior.QuackBehavior; /** * 叫行为的实现类:mute * @author wy * */ public class MuteQuack implements QuackBehavior { @Override public void quack() { // TODO Auto-generated method stub System.out.println("no sound..."); } }
package cn.lan.duck.behavior.impl; import cn.lan.duck.behavior.QuackBehavior; /** * 叫行为的实现类:quack * @author wy * */ public class Quack implements QuackBehavior { @Override public void quack() { // TODO Auto-generated method stub System.out.println("quack..."); } }
package cn.lan.duck.behavior.impl; import cn.lan.duck.behavior.QuackBehavior; /** * 叫行为的实现类:squeak * @author wy * */ public class SqueakQuack implements QuackBehavior { @Override public void quack() { // TODO Auto-generated method stub System.out.println("squeak..."); } }2种飞行实现类和3种叫实现类,再写3种不同的鸭子,每个鸭子的飞和叫的行为都不同,在他们各自的构造方法中绑定好了
package cn.lan.duck; import cn.lan.duck.behavior.impl.FlyWithWins; import cn.lan.duck.behavior.impl.Quack; public class FirstDuck extends Duck { public FirstDuck() { quackBehavior = new Quack(); flyBehavior = new FlyWithWins(); } }
package cn.lan.duck; import cn.lan.duck.behavior.impl.FlyNoWays; import cn.lan.duck.behavior.impl.MuteQuack; public class SecondDuck extends Duck { public SecondDuck() { quackBehavior = new MuteQuack(); flyBehavior = new FlyNoWays(); } }
package cn.lan.duck; import cn.lan.duck.behavior.impl.FlyWithWins; import cn.lan.duck.behavior.impl.SqueakQuack; public class ThirdDuck extends Duck { public ThirdDuck() { quackBehavior = new SqueakQuack(); flyBehavior = new FlyWithWins(); } }再写个测试类:
package test; import cn.lan.duck.Duck; import cn.lan.duck.FirstDuck; import cn.lan.duck.SecondDuck; import cn.lan.duck.ThirdDuck; import cn.lan.duck.behavior.impl.FlyNoWays; import cn.lan.duck.behavior.impl.FlyWithWins; public class DuckTest { public static void main(String[] args) { System.out.println("first duck:"); Duck firstDuck = new FirstDuck(); firstDuck.performFly(); firstDuck.performQuack(); firstDuck.swim(); System.out.println(); System.out.println("second duck:"); Duck secondDuck = new SecondDuck(); secondDuck.performFly(); secondDuck.performQuack(); secondDuck.swim(); System.out.println(); System.out.println("third duck:"); Duck thirdDuck = new ThirdDuck(); thirdDuck.performFly(); thirdDuck.performQuack(); thirdDuck.swim(); System.out.println("change third duck......"); thirdDuck.setFlyBehavior(new FlyNoWays()); thirdDuck.performFly(); } }
这样就把各种行为和Duck类分开了,即使再添加一个新的鸭子类,只需要在这个新的鸭子类中的构造方法中添加属于它的行为即可;
即使在新增一个鸭子行为,也只需要添加一个新的行为接口,然后在需要添加该行为的鸭子类中加上该接口即可;不会因为新增一个行为,
导致大面积更改代码。
输出结果为:
first duck: flying ..... quack... all ducks can swim.... second duck: can not fly... no sound... all ducks can swim.... third duck: flying ..... squeak... all ducks can swim.... change third duck...... can not fly...