策略模式
- 定义了算法簇,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。(来自Head First设计模式)
- 定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,具体类使用这个接口调用不同的算法,一般使用接口或抽象类实现。(来自百度百科)
策略模式类图
策略模式使用场景
需要做一套模拟鸭子游戏,需要实现鸭子的飞行行为和呱呱叫行为,但是鸭子的飞行行为分为会费和不会飞,呱呱叫行为分为呱呱叫、吱吱叫(橡皮鸭)和不会叫。
场景类图类图
代码实现
Duck: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 swim() { System.out.println("All ducks float, even decoys!"); }}
MalardDuck:public class MalardDuck extends Duck{ public MalardDuck(){ quackBehavior = new Quack(); flyBehavior = new FlyWithSwing(); } @Override public void display() { System.out.println("I'm a real malard duck."); }}
FlyBehavior:public interface FlyBehavior { public void fly();}
FlyWithSwing :public class FlyWithSwing implements FlyBehavior { @Override public void fly() { System.out.println("i can fly with swing!"); }}
FlyNoWay:public class FlyNoWay implements FlyBehavior { @Override public void fly() { System.out.println("i cann't fly!"); }}
Quack代码略...
测试:public class testDuck { public static void main(String[] args) { Duck duck = new MalardDuck(); duck.performFly(); duck.performQuack(); }}
测试结果:
i can fly with swing!quack quack quack ...