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++的核心,也是现代高级编 ...
随机推荐
- 【spring 注解驱动开发】spring ioc 原理
尚学堂spring 注解驱动开发学习笔记之 - Spring容器创建 Spring容器创建 1.Spring容器创建-BeanFactory预准备 2.Spring容器创建-执行BeanFactory ...
- WPF---数据绑定之ItemsControl(三)
一.Combox绑定 场景:定义多个Person,Person有Name和Age属性,将多个Person与Combox进行绑定,Combox中只显示Name信息,点击任意一个item,在左侧显示该条目 ...
- SpringBoot2.0 防止XSS攻击
一:什么是XSS XSS攻击全称跨站脚本攻击,是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中. 你可以自己做个简单尝试: 1. 在任何一个表单内,你输 ...
- 一、vue基础语法(轻松入门vue)
轻松入门vue系列 Vue基础语法 一.HelloWord 二.MVVM设计思想 三.指令 1. v-cloak 2. v-text 3. v-html 4. v-show 4. v-pre 5. v ...
- Jsp:taglib实现
web应用的结构: web.xml classes diegoyun OutputTag.class WEB-INF src diegoyun OutputTag.java mytag tlds ...
- ElasticSearch之配置文件详解
################################### Cluster ################################### #定义集群名称,默认是elasticse ...
- webpack编译后的代码如何在浏览器执行
浏览器是无法直接使用模块之间的commonjs或es6,webpack在打包时做了什么处理,才能让浏览器能够执行呢,往下看吧. 使用commonjs语法 先看下写的代码, app.js minus.j ...
- Go错误处理正确姿势
1. panic 在什么情况下使用panic? 在程序启动的时候,如果有强依赖的服务出现故障时panic退出 在程序启动的时候,如果发现有配置明显不符合要求,可以panic退出(预防编程) 其他情况下 ...
- go进阶--测试
目录 1.单元测试 1.1项目结构 1.2 源代码文件 1.3 单元测试 1.4 执行测试 1.5 单元测试总结 2.性能测试 2.1 项目结构 2.2 源码文件 2.3 测试文件 2.4 执行测试 ...
- PB代码转JAVA工具
开发了PB代码转JAVA的工具,正在做datawindow和datastore的处理.以下是目前已经能处理的功能: 1.自动从PBL中获取对象的函数或事件代码 a)可以自动获取实例变量.函数或事件的入 ...