zoukankan      html  css  js  c++  java
  • 策略模式

    策略模式:定义了算法族(行为)分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户,常用的应用场景:用一群类计算不同州的销售金额等。

    实例说明:普通的鸭子会飞也会叫,但是模型鸭子会叫不会飞,现在想让模型鸭子也会飞,将飞和叫的行为分别封装起来。

    鸭子抽象类: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/

  • 相关阅读:
    UINavigationController详细(转)
    IOS控件大全及控件大小
    IOS的各种控件(转载,防止遗忘)
    算法导论学习-heapsort
    POJ1502: MPI Maelstrom
    POJ1163 The Triangle: 倒三角形问题
    算法导论学习-Dynamic Programming
    POJ2299: Ultra-QuickSort-合并排序解决逆序数问题
    POJ3750: 小孩报数问题+一道经典约瑟夫问题(猴子选大王)
    用头插法实现单链表整表创建
  • 原文地址:https://www.cnblogs.com/yuki67/p/9168317.html
Copyright © 2011-2022 走看看