策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的客户而独立变化。 策略模式定义和封装了一系列的算法,它们是可以相互替换的,也就是说它们具有共性,而它们的共性就体现在策略接口的行为上,另外为了达到最后一句话的目的,也就是说让算法独立于使用它的客户而独立变化,我们需要让客户端依赖于策略接口。 说白了就是我们调用的是接口中的规则,而不是针对某一个类的实现。就是利用了多态技术实现的。

策略模式的流程

策略模式的流程

  1. 定义一个接口,定义了要实现的规则。
  2. 定义多个实现类,实现了接口。
  3. 定义策略实施的环境,该环境持有一个策略接口的实例,利用多态的技术,传入要使用的实例。并根据传入的实例调用方法。

策略模式的实现

  1. 定义一个策略接口
    public interface Strategy {
     public void method();
    }
    
  2. 定义策略接口的多个实现类,多个实现类均用不同的方法实现了接口。
    public class ConcreteStrategy1 implements Strategy {
     @Override
     public void method() {
         System.out.println("this is concrete method 1...");
     }
    }
    public class ConcreteStrategy2 implements Strategy {
     @Override
     public void method() {
         System.out.println("this is concrete method 2...");
     }
    }
    
  3. 定义策略运行的环境类,该环境持有接口的对象,在生成时接收一个策略实现类的实例,通过多策略的调用,实现对于在环境中的多种实现。
    public class Context {
     private Strategy strategy;	//定义了一个接口的引用
     public Context(Strategy strategy){
         this.strategy = strategy;	//在初始化环境的时候,传入策略的实现类
     }
     public void contextInterface(){
         strategy.method();	//调用实现类的方法,实现策略。
     }
     public static void main(String[] args) {
         new Context(new ConcreteStrategy1()).contextInterface();	//传入策略,对策略进行调用。
         new Context(new ConcreteStrategy2()).contextInterface();
     }
    }
    this is concrete method 1...
    this is concrete method 2...
    

再看策略模式

  1. 实际上通过接口传入了接口的实现,这被称为策略的传入。
  2. 策略是什么? 策略是一段代码块,如果我们当前策略只有一个方法需要被实现,我们可以使用函数式接口@FunctionalInterface。此时我们可以直接使用Lambda表达式传入代码块。

Reference

  1. 设计模式学习之策略模式