设计模式二十四章经之策略模式

今天有人看了我之前的推文,说我的作息不正常,我就这么被diss了。当然了,懂的人自然懂,不懂的人和他说到最后就是对喷。我也就懒得解释了,下面进入正文。

概述

策略模式在我们日常开发中也是经常遇见的。比如实现某一个功能有多种算法或者策略。我们根据具体情况去实现它。例如:排序算法,我们可以使用插入、冒泡、快排等等。

针对这种情况,我们一般将多个策略写在一个工具类中去方便调用。我们需要A策略就是调用A方法,需要B策略就调用B方法。

如果将这些算法或者策略抽象出来,变成一个接口,不同的策略有不同的实现类。这样我们就可以通过注入不同的对象去实现策略的动态替换,这种模式可扩展和可维护性都很高。

使用场景

1、针对同一类型的问题多种的处理方法。

2、需要安全的封装多种同一类型的操作时。

3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

具体实现

创建一个接口:

public interface Strategy {
   public int doOperation(int num1, int num2);
}

创建2个实体类去实现此接口:

public class OperationAdd implements Strategy{
   @Override
   public int doOperation(int num1, int num2) {
      return num1 + num2;
   }
}
public class OperationSubstract implements Strategy{
   @Override
   public int doOperation(int num1, int num2) {
      return num1 - num2;
   }
}

现在我们创建一个工具类:

public class Utils {
   private Strategy strategy;
   public Utils(Strategy strategy){
      this.strategy = strategy;
   }
   public int executeStrategy(int num1, int num2){
      return strategy.doOperation(num1, num2);
   }
}

最后我们在主函数中去实现:

public class Demo {
   public static void main(String[] args) {
      Utils utils = new Utils(new OperationAdd());        
      System.out.println("10 + 5 = " + utils.executeStrategy(10, 5));
      context = new Context(new OperationSubstract());        
      System.out.println("10 - 5 = " + utils.executeStrategy(10, 5));
   }
}

输出:

10 + 5 = 15
10 - 5 = 5

总结

策略模式主要用来分离算法,在相同的行为抽象下有不同的具体实现策略。这个模式很好的演示的开闭原则,也就是定义抽象,注入不同的实现,从而达到更好的可扩展性。

优点:

  • 结构清晰明了,使用简单直观
  • 耦合度相对而言较低,扩展方便
  • 操作封装更为彻底,数据安全

缺点:

  • 随着策略的增加,子类也会变得繁多。
  • 所有策略类都需要对外暴露。

原文发布于微信公众号 - 我就是马云飞(coding_ma)

原文发表时间:2018-05-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java学习

Java每日一题_关于形参与实参

1、当调用方法时,如果传入的数值为基本数据类型(包含String类型),形式参数的改变对实际参数不影响。

884
来自专栏Java学习网

Java面试题系列之基础部分(六)——每天学5个问题

Java基础部分学习的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io的语法,虚拟机方面的语法,这些都是最基...

2385
来自专栏java达人

方法参数过多怎么办

我们在编程或阅读前人的代码时,经常会看到多个参数的方法,有的甚至达到二十个,看得人眼花缭乱,不便于阅读和维护,而且参数很容易混淆,如两个参数类型同为short型...

1978
来自专栏鸿的学习笔记

从Scala和Python的“shell”说起

在《写给Python和Scala的碎碎念》的系列的开篇,让我们从最简单的交互式“shell”开始,一步步来看看Python和Scala的对于同一件...

812
来自专栏java架构技术

一图胜千言,8 张图理解 Java

一图胜千言,下面图解均来自Program Creek 网站的Java教程,目前它们拥有最多的票选。如果图解没有阐明问题,那么你可以借助它的标题来一窥究竟。

540
来自专栏决胜机器学习

设计模式专题(十五) ——组合模式

设计模式专题(十五)——组合模式 (原创内容,转载请注明来源,谢谢) 一、概述 组合模式(Composite)将对象组合成树形结构,以表示部分-整体的层次结构...

37511
来自专栏Golang语言社区

Go语言中反射的正确使用

介绍 反射是元数据编程的一种形式,指的是程序获得本身结构的一种能力。不同语言的反射模型实现不一样,本文中的反射,仅仅指的是Go语言中的反射模型。 反射有两个问题...

3436
来自专栏Play & Scala 技术分享

原 荐 关于 Scala 隐式转换必读的一篇

2322
来自专栏Java学习网

Java 8的函数式编程学习

Java 8的函数式编程学习 函数式编程语言是什么? 函数式编程语言的核心是它以处理数据的方式处理代码。这意味着函数应该是第一等级(First-class)的...

2347
来自专栏哲学驱动设计

巧用拦截器:高效的扩展点设计

最近在设计框架时,需要设计一类扩展点,发现不能简单地继承或使用事件来给使用者提供 API。最终使用拦截器模式解决了 API 的设计。 扩展点使用场景 ...

19010

扫码关注云+社区