ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

设计模式之策略模式

2021-08-30 08:31:37  阅读:182  来源: 互联网

标签:策略 void 模式 strategy Strategy 设计模式 public


定义

定义一系列的算法,把它们一个个封装起来,并且使它们可互相替换,本模式使得算法可独立于使用它的客户而变化。
例如我们生活中出行可以选择火车,飞机,私家车等方式,每一种出行方式就可以看做一种策略。

结构

  • Strategy,策略接口,用来约束一系列具体的策略接口。
  • ConcreteStrategy,具体策略实现类,提供具体的算法实现。
  • Context,上下文,负责和具体的策略类交互。

简单实现

策略接口

public interface Strategy {

  void strategyMethod();
}

具体策略实现类

public class ConcreteStrategyA implements Strategy {

  @Override
  public void strategyMethod() {
    System.out.println("具体策略A执行");
  }
}

另一个具体策略实现

public class ConcreteStrategyB implements Strategy {

  @Override
  public void strategyMethod() {
    System.out.println("具体策略B执行");
  }
}

上下文

public class Context {

  private Strategy strategy;

  public Context(Strategy strategy) {
    this.strategy = strategy;
  }

  public void strategyMethod() {
    strategy.strategyMethod();
  }
}

客户端

public class Client {

  public static void main(String[] args) {
    Strategy strategy = new ConcreteStrategyA();
    Context context = new Context(strategy);
    context.strategyMethod();
  }

}

策略模式在JDK中的实现

JDK中的Comparator接口

import java.util.Arrays;
import java.util.Comparator;

public class Client {

  public static void main(String[] args) {
    String[] names = {"张三", "李四", "小明"};
    Comparator<String> comparator = new Comparator<>() {
      @Override
      public int compare(String o1, String o2) {
        return o1.compareTo(o2);
      }
    };
    Arrays.sort(names, comparator);
    System.out.println(Arrays.toString(names));
  }

}

Comparator就是策略接口,使用匿名内部类来实现具体策略类。

总结

优点

  1. 避免了多重的条件语句,易于维护。
  2. 更好的扩展性,方便增加新的策略实现,符合开闭原则。

缺点

  1. 客户端必须了解每种策略的不同才能正确的选择使用哪种策略,这样就暴露了策略的具体实现。

本质

策略模式的本质是分离算法,选择实现。分离并封装了算法,才能够很容易的修改和增加算法,也能很容易的动态切换算法。
具体实现中,可以去掉上下文对象,客户端直接和具体策略交互。

使用场景

  1. 一个定义了很多行为的类,并且是通过多个if-else语句来选择这些行为的情况,可以使用策略模式来代替这些条件语句。
  2. 需要动态的切换不同的算法。

参考

大战设计模式【1】—— 策略模式
设计模式的征途—18.策略(Strategy)模式
设计模式(二十三)——策略模式(Arrays源码分析)
设计模式——策略模式
策略模式(策略设计模式)详解
研磨设计模式-书籍

标签:策略,void,模式,strategy,Strategy,设计模式,public
来源: https://www.cnblogs.com/strongmore/p/15203881.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有