美文网首页
5、Strategy 策略模式

5、Strategy 策略模式

作者: 冰镇柠檬_tree | 来源:发表于2019-04-02 17:21 被阅读0次

    1、定义

    策略模式的主要目的是将算法的定义和使用分开,也就是将算法的行为和环境分开,将算法的定义放在专门的策略类中,每一个策略类封装一个实现算法。而使用算法的环境中针对抽象策略编程,而不是针对实现编程,符合依赖倒置原则
    (1)Context(环境类):负责使用算法策略,其中维持了一个抽象策略类的引用实例。

    /**
     * 策略上下文
     */
    public class StrategyContext {
        //持有一个策略实现的引用
        private IStrategy strategy;
        //使用构造器注入具体的策略类
        public StrategyContext(IStrategy strategy) {
            this.strategy = strategy;
        }
    
        public void contextMethod(){
            //调用策略实现的方法
            strategy.algorithmMethod();
        }
    }
    

    (2)Strategy(抽象策略类):所有策略类的父类,为所支持的策略算法声明了抽象方法。=> 既可以是抽象类也可以是接口

    //策略接口
    public interface IStrategy {
        //定义的抽象算法方法 来约束具体的算法实现方法
        public void algorithmMethod();
    }
    

    (3)ConcreteStrategy(具体策略类):实现了在抽象策略类中声明的方法。

    // 具体的策略实现
    public class ConcreteStrategy implements IStrategy {
        //具体的算法实现
        @Override
        public void algorithmMethod() {
            System.out.println("this is ConcreteStrategy method...");
        }
    }
    
     // 具体的策略实现2
    public class ConcreteStrategy2 implements IStrategy {
         //具体的算法实现
        @Override
        public void algorithmMethod() {
            System.out.println("this is ConcreteStrategy2 method...");
        }
    }
    

    (4)Demo 
    策略模式就是把各个平等的具体实现进行抽象、封装成为独立的算法类,然后通过上下文和具体的算法类来进行交互。各个策略算法都是平等的,地位是一样的,正是由于各个算法的平等性,所以它们才是可以相互替换的。虽然我们可以动态的切换各个策略,但是同一时刻只能使用一个策略。

    //外部客户端
    public class Client {
        public static void main(String[] args) {
            //1.创建具体测策略实现
            IStrategy strategy = new ConcreteStrategy2();
            //2.在创建策略上下文的同时,将具体的策略实现对象注入到策略上下文当中
            StrategyContext ctx = new StrategyContext(strategy);
            //3.调用上下文对象的方法来完成对具体策略实现的回调
            ctx.contextMethod();
        }
    }
    

    相关文章

      网友评论

          本文标题:5、Strategy 策略模式

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