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++的核心,也是现代高级编 ...
随机推荐
- javaWeb常用面试题
JDBC JDBC访问数据库的基本步骤是什么? 加载驱动 通过DriverManager对象获取连接对象Connection 通过连接对象获取会话,有2种方式Statement.PreparedSta ...
- .static 和const分别怎么用,类里面static和const可以同时修饰成员函数吗。
static的作用: 对变量: 1.局部变量: 在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量. 1)内存中的位置:静态存储区 2)初始化:局部的静态变量只能被初始化一次, ...
- C++11 shared_ptr(智能指针)详解
要确保用 new 动态分配的内存空间在程序的各条执行路径都能被释放是一件麻烦的事情.C++ 11 模板库的 <memory> 头文件中定义的智能指针,即 shared _ptr 模板,就是 ...
- wpf toggleSwitch 的只读属性
xml code --------------------------------------------- <Page x:Class="UWPDemo.MainPage" ...
- clojure配置
1.转换clojure工程为eclipse工程 Install Counterclockwise plugin in Eclipse (from eclipse marketplace). This ...
- js判断checkbox是否选中 .checked不管用
今天开发遇到一个小问题,记小本本记小本本 document.getElementById("id").checked //正确 //如果返回值为true代表选中 //如果返回值为f ...
- Android WorkManager 定时任务
App有时可能需要定期运行某些工作.例如,可能要定期备份数据.上传信息到服务器,定期获取新的内容等等. 在app运行期间,我们使用Handler也可以完成定期的功能.在这里我们介绍WorkManage ...
- Java编程:为什么Class实例可以不是全局唯一
通过定义两个类加载器加载同一字节码文件来证明Class实例为什么不是全局唯一的 1.将一个名为Demo(没有后缀)的字节码文件放在D盘根目录 2.定义两个类加载器 自定义ClassLoader三要素: ...
- MongoDB 常见问题 - 解决 brew services list 查看 MongoDB 服务 status 显示 error 的问题
问题背景 将 MongoDB 作为服务运行 brew services start mongodb-community@4.4 也显示运行成功了,但是查看服务列表的时候,发现 MongoDB 服务的还 ...
- 【机器学习|数学基础】Mathematics for Machine Learning系列之线性代数(1):二阶与三阶行列式、全排列及其逆序数
@ 目录 前言 二阶与三阶行列式 二阶行列式 三阶行列式 全排列及其逆序数 全排列 逆序数 结语 前言 Hello!小伙伴! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出- 自我介绍 ...