美文网首页
策略模式 2018-11-04

策略模式 2018-11-04

作者: 单是一个姓 | 来源:发表于2018-11-04 20:56 被阅读0次

    设计模式之策略模式

    官方说明设计模式的3个角色:

    1. 环境角色:context , 持有一个策略的引用
    2. 抽象策略角色,是一个抽象角色,此角色给出所有的具体策略类所需的接口
    3. 具体策略角色,包装了相关的算法和行为。即抽象策略的具体实现

    借图说明之间相互关系:

    策略模式特点:

    • 重心不在于如何实现算法,在于如何组织、调用这些算法
    • 各个策略算法是相互独立、没有依赖、各个之间平等

    案例:(写了一遍网上流行的真鸭子,假鸭子DUCK会不会飞的案例)
    情景:
    对象:真鸭子,石头鸭子,
    能力:都会游泳(假如),真鸭子会飞,石头鸭子不会飞

    策略实现:
     /**
       * 真鸭子,石头鸭子实现的抽象类
      */
    public abstract class DUCK {
        /**
         * 持有一个Strategy的引用。即封装了接口鸭子飞这个行为接口
         */
        IFlyBehavior flyBehavior;
        void setFlyBehavior(IFlyBehavior fb) {
            flyBehavior = fb;
        }
    
        abstract void swim();
    
        public void fly() {
            flyBehavior.fly();
        }
    }
    

    石头鸭子和真鸭子实体类,继承抽象类DUCK

    public class StoneDuck extends DUCK {
        public StoneDuck() {
            flyBehavior = new BadFlyBehavior();
        }
    
        @Override
        void swim() {
            System.out.println("******");
        }
    }
    
    public class RealDuck extends DUCK {
        public RealDuck() {
            flyBehavior = new GoodFlyBehavior();
        }
    
        @Override
        void swim() {
            System.out.println("*********");
        }
    }
    

    鸭子会飞这个能力的策略抽象接口:

    /**
     * 给出所有的具体策略类所需的接口
     */
    public interface IFlyBehavior {
        /**
         * 鸭子飞翔的动作
         */
        void fly();
    }
    
    public class GoodFlyBehavior implements IFlyBehavior {
        @Override
        public void fly() {
            System.out.println("****I can fly****");
        }
    }
    
    public class BadFlyBehavior implements IFlyBehavior {
        @Override
        public void fly() {
            System.out.println("***not fly***");
        }
    }
    
    public static  void  main(String[] args) {
            DUCK stoneDuck = new StoneDuck();
            stoneDuck.fly();
    
            // 改变策略
            stoneDuck.setFlyBehavior(new GoodFlyBehavior());
            stoneDuck.fly();
    
            /**
             * 打印结果:
             *
             * ***not fly***
             * ****I can fly****
             *
             */
        }
    

    优秀策略模式文章:

    JAVA与模式之策略模式
    java 开发模式之一 : 策略模式

    相关文章

      网友评论

          本文标题:策略模式 2018-11-04

          本文链接:https://www.haomeiwen.com/subject/luydxqtx.html