定义:策略模式定义了算法族(每一个行为的实现都是算法,合起来就是算法族),分别封装起来,让它们之间能够互相替换,此模式让算法的变化独立于使用算法的客户。java
设计原则:算法
一、找出应用中可能须要变化之处,把它们独立出来,不要和那些不须要的变化的代码混在一块儿编程
二、针对接口编程,而不是针对实现编程(利用多态)测试
三、多用组合,少用继承设计
每个鸭子都有一个FlyBehavior和QuackBehavior,能够将飞行和呱呱叫的行为都委托给它们处理。code
当两个类结合起来使用,就是组合。这种和继承的不一样在于,鸭子的行为不是继承来的,而是和适当的行为对象“组合”来的。orm
Duck类:对象
Duck.java package com.sun; 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 fb){ //会经过接口(多态的表现形式之一)行为改变为相应的飞行行为(调用相应行为的方法) flyBehavior = fb; } public void setQuackBehavior(QuackBehavior qb){ quackBehavior = qb; } public void swim(){ System.out.println("All ducks float,even decoys!"); } }
MallardDuck类:继承
package com.sun; public class MallardDuck extends Duck{ public MallardDuck(){ //是对MallardDuck的具体实现 quackBehavior = new Quack(); flyBehavior = new FlywithWings(); } public void display(){ System.out.println("I'm a real Mallard duck"); } }
ModelDuck类:接口
package com.sun; 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 com.sun; /* * 飞的行为类 */ public interface FlyBehavior { public void fly(); }
如下是飞的接口的三个实现类:
package com.sun; public class FlyNoWay implements FlyBehavior { public void fly() { System.out.println("i can't fly!!"); } } package com.sun; public class FlyRocketPowered implements FlyBehavior { public void fly() { System.out.println("I'm fly with a rocket!"); } } package com.sun; public class FlywithWings implements FlyBehavior { public void fly() { System.out.println("I'm flying!!"); } }
QuackBehavior行为的接口:
package com.sun; /* * 叫的行为类 */ public interface QuackBehavior { public void quack(); }
如下是QuackBehavior接口的实现类:
package com.sun; public class Quack implements QuackBehavior { public void quack() { System.out.println("quack!!"); } } package com.sun; public class Squeak implements QuackBehavior { public void quack() { System.out.println("quack"); } } package com.sun; public class MuteQuack implements QuackBehavior { public void quack() { System.out.println("<<>silence>"); } }
测试类:
package com.sun; /* * 测试类 */ public class MiniDuckSimulator { public static void main(String[] args) { //静态设定行为 Duck mallard = new MallardDuck(); mallard.performQuack(); mallard.performFly(); /* 动态设定行为,经过在Duck中增长两个set方法 在运行时想改变鸭子的行为,只需调用鸭子的setter方法就能够 */ Duck model = new ModelDuck(); model.performFly(); model.setFlyBehavior(new FlyRocketPowered()); model.performFly(); } }