strategy策略模式个人理解
首先了解策略模式的主要作用:能够把算法进行封装和动态传递;
可能听上去很抽象,我们引入一个方便理解的案例来解释;
给定一个数组
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策略模式个人理解的更多相关文章
- Java的设计模式----strategy(策略模式)
设计模式: 一个程序员对设计模式的理解: “不懂”为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的“复杂”恰恰就是设计模式的精髓所在,我所理解的“简单”就是一把钥匙开 ...
- 一天一个设计模式——Strategy策略模式
一.模式说明 策略模式比较好理解,就是将程序中用到的算法整体的拿出来,并有多个不同版本的算法实现,在程序运行阶段,动态的决定使用哪个算法来解决问题. 举个实际的例子:排序算法的问题,假如我们的程序中需 ...
- 10、Strategy 策略模式 整体地替换算法 行为型模式
1.模式说明 策略模式比较好理解,就是将程序中用到的算法整体的拿出来,并有多个不同版本的算法实现,在程序运行阶段,动态的决定使用哪个算法来解决问题. 2.举例 排序算法的问题,假如我们的程序中需要对数 ...
- C++设计模式-Strategy策略模式
Strategy策略模式作用:定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. UML图: Strategy模式将逻辑(算法)封装到一个类(Cont ...
- 设计模式22:Strategy 策略模式(行为型模式)
Strategy 策略模式(行为型模式) 动机(Motivation) 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂:而且有时候支持 ...
- Strategy策略模式
策略模式定义了一系列算法,把它们一个个封装起来,并且使它们可相互替换.该模式可使得算法能独立于使用它的客户而变化.Strategy模式是行为模式,正因为他是一种行为模式,所以他不是用来解决类的实例化的 ...
- 设计模式:Strategy 策略模式 -- 行为型
设计模式 策略模式Strategy(对象行为型) 这是几年前写的文字(转载做的笔记更准确些),发觉还是废话多了点. 其实,核心就是5.结构中的UML图 5.1 和 5.2(新增).现在看这张图就觉得一 ...
- 设计模式(21)--Strategy(策略模式)--行为型
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而 ...
- [C++设计模式] strategy 策略模式
依照陈硕老师的观点.c++里有面向过程编程.面向对象编程,基于对象编程(面向接口编程)和泛型编程.四种思路都各有其适用场景. 面向过程编程是沿袭C的结构化编程思路,OOP是C++的核心,也是现代高级编 ...
随机推荐
- SpringBoot使用@Scheduled创建定时任务
定时任务一般会存在中大型企业级项目中,为了减少服务器.数据库的压力往往会采用时间段性的去完成某些业务逻辑.比较常见的就是金融服务系统推送回调,一般支付系统订单在没有收到成功的回调返回内容时会持续性的回 ...
- python创建字典多种方式
1.创建空字典 >>> dic = {} >>> type(dic) <type 'dict'> 2.直接赋值创建 >>> dic = ...
- 从新建文件夹开始构建ShadowPlay Engine(5)
本篇序言 从本篇开始,我们要开始构建引擎核心中的系统组件部分,广义上讲其实我们从开始到现在一直都是在构建引擎核心中的系统部分,但严格的定义中系统组件大概有这么几个:内存管理,线程管理,文件管理,时间系 ...
- Layui form表单提交注意事项
// 表单提交form.on('submit(first1)', function (data) { var articleFrom = data.field; $.ajax({ type:" ...
- Tensorflow 2.0 深度学习实战 —— 详细介绍损失函数、优化器、激活函数、多层感知机的实现原理
前言 AI 人工智能包含了机器学习与深度学习,在前几篇文章曾经介绍过机器学习的基础知识,包括了监督学习和无监督学习,有兴趣的朋友可以阅读< Python 机器学习实战 >.而深度学习开始只 ...
- Spring笔记(4)
集成Web环境 1.步骤 导入Spring-web坐标 <!-- spring-web--> <dependency> <groupId>org.springfra ...
- PENETRATION第一步
PENETRATION第一步 第一次去打靶机,本来都快成功了,电脑蓝屏警告了...(=_=) 靶机下载连接 (https://download.vulnhub.com/admx/AdmX_new.7z ...
- JDK1.8源码阅读笔记(1)Object类
JDK1.8源码阅读笔记(1)Object类 Object 类属于 java.lang 包,此包下的所有类在使⽤时⽆需⼿动导⼊,系统会在程序编译期间⾃动 导⼊.Object 类是所有类的基类,当⼀ ...
- Mybatis-Plus增强包
简介 本框架(Gitee地址 )结合公司日常业务场景,对Mybatis-Plus 做了进一步的拓展封装,即保留MP原功能,又添加更多有用便捷的功能.具体拓展体现在数据自动填充(类似JPA中的审计).关 ...
- 如何实现 Android 短视频跨页面的流畅续播?
在一切皆可视频化的今天,短视频内容作为移动端产品新的促活点,受到了越来越多的重视与投入,同时短视频也是增加用户粘性.增加用户停留时长的一把利器.那么如何快速实现移动端短视频功能呢?前两篇我们介绍了盒马 ...