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

今天有人看了我之前的推文,说我的作息不正常,我就这么被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 条评论
登录 后参与评论

相关文章

来自专栏韩伟的专栏

框架设计原则和规范(一)

此文是《.NET:框架设计原则、规范》的读书笔记,本文内容较多,共分九章,将分4天进行推送,今天推送1-3章。 1. 什么是好的框架 2. 框架设计...

3925
来自专栏转载gongluck的CSDN博客

黑暗的内存管理

黑暗的内存管理 很多人对 C 语言深恶痛绝,仅仅是因为 C 语言迫使他们在编程中必须手动分配与释放内存,然后通过指针去访问,稍有不慎可能就会导...

3876
来自专栏烙馅饼喽的技术分享

记一个脚本解释器的开发

最近可以有1个月左右的空闲,可以稍微整理一下这个脚本解释器的开发过程。 一、缘由   2014年左右,我们使用AIR技术,开发了一个3D战争类型的手游。那时候手...

3687
来自专栏Android机动车

如何用五点教会你Python高效编程

我已经使用Python编程有多年了,即使今天我仍然惊奇于这种语言所能让代码表现出的整洁和对DRY编程原则的适用。

903
来自专栏ThoughtWorks

语言设计中的鸭子类型风格

image.png #思特沃克好声音# (图片:网络) 在动态语言的世界里一直流传着一种叫做鸭子类型的风格,其来自谚语:“如果行鸭子一样走路,像鸭子一样呱呱叫...

2887
来自专栏醒者呆

促和谐好干部——适配器模式

我们的笔记本电脑的充电线上通常都会有一个大砖块似得东西,这个东西是用来将家用额定电压220V转换成笔记本适用的电压,它叫做变压器,也叫做适配器。 今天要研究的是...

3655
来自专栏企鹅号快讯

Python 相较于Java 而言,有什么优势?

最近在后台,有很多的同学私聊我说,Python和Java.,哪个具有前景呢?今天我们就来简单的讲一下这两者的区别: 我认为C, Java跟Python都是非常成...

2316
来自专栏Java技术栈

6 道 BATJ 必考的 Java 面试题

请对比 Exception 和 Error,另外,运行时异常与一般异常有什么区别?

991
来自专栏马洪彪

spss C# 二次开发 学习笔记(二)——Spss以及统计术语解释(IT人眼中的统计术语)

针对客户需求,需要对一些数据做统计分析。统计分析的第一步,即为数据查询,查找出要统计分析的数据。 查询得出的是一个行列表格的结果集,行、列、表格等这些IT的数据...

2735
来自专栏C/C++基础

C++以智能指针管理内存资源

C++作为一门应用广泛的高级编程语言,却没有像Java、C#等语言拥有垃圾回收(Garbage Collection )机制来自动进行内存管理,这也是C++一直...

933

扫码关注云+社区