策略模式:定义了算法族(行为)分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户,常用的应用场景:用一群类计算不同州的销售金额等。
实例说明:普通的鸭子会飞也会叫,但是模型鸭子会叫不会飞,现在想让模型鸭子也会飞,将飞和叫的行为分别封装起来。
鸭子抽象类:Duck.java
/** * 鸭子抽象类 * * @author :liuqi * @date :2018-06-11 17:10. */ public abstract class Duck { /** * 封装飞行行为 */ FlyBehavior flyBehavior; /** * 封装叫行为 */ QuackBehavior quackBehavior; /** * 构造器 */ public Duck() { } /** * 描述继承子类的方法 */ abstract void display(); /** * 表演飞行 */ public void performFly() { // 委托给飞行行为类 flyBehavior.fly(); } /** * 表演叫 */ public void performQuack() { // 委托给叫行为类 quackBehavior.quack(); } /** * 游泳(所有鸭子都会游泳) */ void swim() { System.out.println("All ducks float,even decoys!"); } /** * 设置飞行行为(可随时改变行为) */ void setFlyBehavior(FlyBehavior fb) { flyBehavior = fb; } /** * 设置叫行为(可随时改变行为) */ void setQuackBehavior(QuackBehavior qb) { quackBehavior = qb; } }
模型鸭子实现类:ModelDuck.java
/** * 模型鸭子:会叫不会飞 * * @author :liuqi * @date :2018-06-11 17:24. */ public class ModelDuck extends Duck{ /** * 构造器 */ public ModelDuck(){ flyBehavior = new FlyNoway(); quackBehavior = new Quack(); } /** * 描述方法 */ @Override void display() { System.out.println("I'm a model duck"); } }
飞行行为接口:FlyBehavior.java
/** * 飞行行为接口 * * @author :liuqi * @date :2018-06-11 17:11. */ public interface FlyBehavior { /** * 飞行 */ void fly(); }
不会飞实现类:FlyNoway.java
/** * 不会飞 * * @author :liuqi * @date :2018-06-11 17:27. */ public class FlyNoway implements FlyBehavior { @Override public void fly() { System.out.println("I can't fly"); } }
带火箭飞实现类:FlyRocketPowered.java
/** * 用火箭飞起来 * * @author :liuqi * @date :2018-06-11 17:31. */ public class FlyRocketPowered implements FlyBehavior { @Override public void fly() { System.out.println("I'm flying with a rocket"); } }
叫的行为接口:QuackBehavior.java
/** * 叫的行为接口 * * @author :liuqi * @date :2018-06-11 17:12. */ public interface QuackBehavior { /** * 叫 */ void quack(); }
会叫的实现类:Quack.java
/** * 会叫 * * @author :liuqi * @date :2018-06-11 17:28. */ public class Quack implements QuackBehavior { @Override public void quack() { System.out.println("Quack"); } }
测试类:DuckTestDrive.java
/** * 测试类 * * @author :liuqi * @date :2018-06-11 17:29. */ public class DuckTestDrive { public static void main(String[] args) { // 模型鸭子 Duck modelDuck = new ModelDuck(); modelDuck.performFly(); modelDuck.setFlyBehavior(new FlyRocketPowered()); modelDuck.performFly(); } }
运行结果:
I can't fly
I'm flying with a rocket
代码地址:https://github.com/yuki9467/TST-javademo/tree/master/src/main/strategy
另一个实例:计算购车总金额,
购买5辆及以下不打折
购买6-10辆打9.5折
购买11-20辆打9折算法实现
购买20辆以上打8.5折算法实现
实现地址:http://www.private-blog.com/2017/11/16/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E7%AD%96%E7%95%A5%E6%A8%A1%E5%BC%8F/