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

    一、是什么?作用?

      策略模式的思想是定义一些算法族,分别封装起来,让他们可以相互替换,此模式让算法的变化独立于使用算法的客户

      策略模式的适用场景: 

    • 当一个系统中有许多类,它们之间的区别仅在于它们的行为,希望动态地让一个对象在许多行为中选择一种行为时; 
    • 当一个系统需要动态地在几种算法中选择一种时;
    • 当一个对象有很多的行为,不想使用多重的条件选择语句来选择使用哪个行为时。

    二、使用实例

      场景:鸭子分为绿头鸭和模型鸭子,以后还能有其他鸭子,绿头鸭可以呱呱叫,也可以用翅膀飞,模型鸭子可以呱呱叫,但是不能飞

      1. 定义飞的接口行为 

    /**
     * 飞的接口类
     */
    public interface FlyBehavior {
    
        void fly();
    }
    
    // ============================
    /**
     * 用翅膀飞 - 实现类
     */
    public class FlyWithWings implements FlyBehavior {
        @Override
        public void fly() {
            System.out.println("I'm flying");
        }
    }
    
    // =========================
    
    /**
     * 不会飞 - 实现类
     */
    public class FlyNoWay implements FlyBehavior {
        @Override
        public void fly() {
            System.out.println("I can't fly");
        }
    }

    2. 定义叫的接口行为

    /**
     * 叫的接口类
     */
    public interface QuackBehavior {
    
        void quack();
    }
    
    // =======================
    /**
     * 咕咕叫
     */
    public class MuteQuack implements QuackBehavior {
        @Override
        public void quack() {
            System.out.println("咕咕叫");
        }
    }
    
    // =======================
    
    /**
     * 嘎嘎叫
     */
    public class Squeak implements QuackBehavior {
        @Override
        public void quack() {
            System.out.println("嘎嘎叫");
        }
    }

    3. 编写鸭子类, 注意这里有的是组合

    /**
     * 鸭子类 基类, 注: 这里可以写给set行为的方法,方便动态设置行为
     */
    public abstract class Duck {
    
        private FlyBehavior flyBehavior;
        private QuackBehavior quackBehavior;
    
        public Duck() { }
    
        // 执行飞的动作
        public void performFly() {
            flyBehavior.fly();
        }
    
        // 执行叫的动作
        public void performQuack() {
            quackBehavior.quack();
        }
    }
    /**
     * 绿头野鸭类 注意点: 就在鸭子的行为在这个时候赋值给鸭子, 想换别的行为随便换 
     */
    public class MallardDuck extends Duck{
    
        public MallardDuck() {
            this.flyBehavior = new FlyWithWings();
            this.quackBehavior = new MuteQuack();
        }
    }

    4. 测试

    /**
     * 小鸭子测试类
     */
    public class MiniDuckSimulator {
    
        public static void main(String[] args) {
            Duck mallard = new MallardDuck();
            mallard.performFly();
            mallard.performQuack();
        }
    }

    三、总结

    1.如果是以前我很可能有鸭子抽象类来定义飞的行为,子类重写飞的行为,当忽然添加另外一种鸭子,它有特殊的行飞的行为(带火箭喷射器的翅膀),这时候又得重写这个行为,不管什么鸭子,我都得重写他的飞的行为;

    2. 如果用了策略模式,只需要要编写这个特殊飞的行为,然后在这只鸭身上赋上这种行为就行了,其他已经编写的代码一点都没有收到影响,牛批

  • 相关阅读:
    257. Binary Tree Paths
    324. Wiggle Sort II
    315. Count of Smaller Numbers After Self
    350. Intersection of Two Arrays II
    295. Find Median from Data Stream
    289. Game of Life
    287. Find the Duplicate Number
    279. Perfect Squares
    384. Shuffle an Array
    E
  • 原文地址:https://www.cnblogs.com/milicool/p/11153221.html
Copyright © 2011-2022 走看看