首先了解策略模式的主要作用:能够把算法进行封装和动态传递;

可能听上去很抽象,我们引入一个方便理解的案例来解释;


给定一个数组

int[] array = {32,12,42,26,-23,0,-2,99,-19,-29};

设计功能要求:输出所有的数字大于0的数字

很简单

      //判断正数
public void filterPositive(int[] array){
for (int i = 0; i < arrays.length; i++) {
int number = array[i];
if(number > 0){
System.out.println(number);
}
}
}

那现在又有其他功能需求,输出所有数字小于0的数字

同样也很简单

      //判断负数
public void filterNegative(int[] array){
for (int i = 0; i < arrays.length; i++) {
int number = array[i];
if(number < 0){
System.out.println(number);
}
}
}

那现在,又需要其他功能,输出所有奇数

      //判断奇数
public void filterOdd(int[] array){
for (int i = 0; i < arrays.length; i++) {
int number = array[i];
if(number%2 == 1){
System.out.println(number);
}
}
}

随着功能的逐渐增多,我们还有输出所有偶数,输出所有大于10的数,输出所有小于-10的数。。。

但是我们观察上面的三段代码,发现他们大部分代码都相同,只有if判断条件不同

//判断正数
if(number > 0){
//判断负数
if(number < 0){
//判断奇数
if(number %2 == 1){

那么我们能否将这些判断的条件作为一个参数传递呢?只需在代码中传入判断方法

    public void filter(int[] array,判断方法){
for (int i = 0; i < arrays.length; i++) {
int number = array[i];
if(判断方法.判断(number)){
System.out.println(number);
}
}
}

这样我们只需要传入不同的判断方法就可以执行不同的判断逻辑

我们可以使用接口来定义判断方法的规范

public interface MyPredicate {
//判断i是否满足条件,满足返回true
public boolean test(int i);
}

在将来使用它时,只需要传入MyPredicate的实现类,调用test方法即可

    public void filter(int[] array,Mypredicate mp){
for (int i = 0; i < arrays.length; i++) {
int number = array[i];
if(mp.test(number)){
System.out.println(number);
}
}
}

1、我们可以手动实现输出大于0的MyPredicate实现类

public class FindPositive implements MyPredicate {
@Override
public boolean test(int i) {
return i > 0;
}
}

调用时只需在调用filter方法的同时,传入一个FindPositive对象即可

但是这样子的话,又会导致类过多的情况,每一个判断条件都需要写一个类,而且这个类也并不是很常用

2、我们可以通过匿名内部类来实现

        MyPredicate myPredicate1 = new MyPredicate() {
@Override
public boolean test(int i) {
return i > 0;
}
};

3、或者在jdk8中可以通过Lambda表达式来更简化

      MyPredicate myPredicate2 = (i) -> {i > 0};
//简化后
MyPredicate myPredicate2 = i -> i > 0;

在将来调用的时候只需传入MyPredicate的实现类对象即可

filter(arrays, myPredicate2)

上面的例子可能比较抽象,下面举一个贴合实际的例子

我们有一个学生对象,有身高,年龄,分数等信息

在我们对学生进行筛选的时候,会有许多条件,身高大于170,身高低于200,年龄大于20,分数大于60分。。。等等许多判断逻辑,这是我们就可以使用策略模式解决

strategy策略模式个人理解的更多相关文章

  1. Java的设计模式----strategy(策略模式)

    设计模式: 一个程序员对设计模式的理解: “不懂”为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的“复杂”恰恰就是设计模式的精髓所在,我所理解的“简单”就是一把钥匙开 ...

  2. 一天一个设计模式——Strategy策略模式

    一.模式说明 策略模式比较好理解,就是将程序中用到的算法整体的拿出来,并有多个不同版本的算法实现,在程序运行阶段,动态的决定使用哪个算法来解决问题. 举个实际的例子:排序算法的问题,假如我们的程序中需 ...

  3. 10、Strategy 策略模式 整体地替换算法 行为型模式

    1.模式说明 策略模式比较好理解,就是将程序中用到的算法整体的拿出来,并有多个不同版本的算法实现,在程序运行阶段,动态的决定使用哪个算法来解决问题. 2.举例 排序算法的问题,假如我们的程序中需要对数 ...

  4. C++设计模式-Strategy策略模式

    Strategy策略模式作用:定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. UML图: Strategy模式将逻辑(算法)封装到一个类(Cont ...

  5. 设计模式22:Strategy 策略模式(行为型模式)

    Strategy 策略模式(行为型模式) 动机(Motivation) 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂:而且有时候支持 ...

  6. Strategy策略模式

    策略模式定义了一系列算法,把它们一个个封装起来,并且使它们可相互替换.该模式可使得算法能独立于使用它的客户而变化.Strategy模式是行为模式,正因为他是一种行为模式,所以他不是用来解决类的实例化的 ...

  7. 设计模式:Strategy 策略模式 -- 行为型

    设计模式 策略模式Strategy(对象行为型) 这是几年前写的文字(转载做的笔记更准确些),发觉还是废话多了点. 其实,核心就是5.结构中的UML图 5.1 和 5.2(新增).现在看这张图就觉得一 ...

  8. 设计模式(21)--Strategy(策略模式)--行为型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而 ...

  9. [C++设计模式] strategy 策略模式

    依照陈硕老师的观点.c++里有面向过程编程.面向对象编程,基于对象编程(面向接口编程)和泛型编程.四种思路都各有其适用场景. 面向过程编程是沿袭C的结构化编程思路,OOP是C++的核心,也是现代高级编 ...

随机推荐

  1. nuxt.js服务端渲染中less的配置和使用

    第一步:npm 安装 less 和 less-loader ,文件根目录下安装,指令如下 npm install less less-loader --save-dev 第二步:直接在组件中使用 &l ...

  2. TortoiseGit冲突和解决冲突

    产生冲突原因 产生:多个开发者同时使用或者操作git中的同一个文件,最后在依次提交commit和推送push的时候,第一个操作的是可以正常提交的,而之后的开发者想要执行pull(拉)和pull(推)操 ...

  3. SpringBoot的快速入门

    快速创建一个SpringBoot项目(两种方式:STS版本,IntelliJ IDEA) 1.STS方式:什么是STS?是Spring团队推荐使用的开发工具 所谓的sts就是eclipse升级版 继承 ...

  4. 将svn项目导出,再导入到其他工作空间

    方法一: 对于一致svn地址,本地没有的项目,直接eclipse中svn检出即可. 若本地有项目,但想导入到另一个工作空间(即拷贝一份,不想再从svn拉),则需要用export方法. 方法二(expo ...

  5. JSP编码问题

    JSP的开头内容: 1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 ...

  6. blender skin modifier 太好玩了

    https://docs.blender.org/manual/en/latest/modeling/modifiers/generate/skin.html 只需要像画火柴人一样把点连起来,skin ...

  7. vue 引用 tcplayer 做直播( 俩个例子,都可以用。替换直播地址即可,后端推流,前端观看。 )

    例子一比例子二更加容易被理解.另外 m3u8 也支持 webrtc 开头的直播地址. 补充JS 得下载到本地,自行引入: https://imgcache.qq.com/open/qcloud/liv ...

  8. client-go实战之二:RESTClient

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  9. 对 RESTful 的理解

    REST 全称 Representation State Transfor (资源表现层状态改变) 实际上是指客户端通过http/https协议手段来改变URI的状态转化,达到请求不同的资源的目的. ...

  10. 八、Abp vNext 基础篇丨标签聚合功能

    介绍 本章节先来把上一章漏掉的上传文件处理下,然后实现Tag功能. 上传文件 上传文件其实不含在任何一个聚合中,它属于一个独立的辅助性功能,先把抽象接口定义一下,在Bcvp.Blog.Core.App ...