strategy策略模式个人理解
2024-08-26 21:10:40
首先了解策略模式的主要作用:能够把算法进行封装和动态传递;
可能听上去很抽象,我们引入一个方便理解的案例来解释;
给定一个数组
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分。。。等等许多判断逻辑,这是我们就可以使用策略模式解决
最新文章
- 谈谈Lucene和Solr索引存目录
- 三、jQuery--jQuery基础--jQuery基础课程--第5章 jQuery 操作DOM元素
- URAL 1876 Centipede&#39;s Morning(数学)
- c#中struct和class的区别 详细[转]
- WebBrowers &; HtmlViewers collection
- 令人惊奇的gdb和pstack
- POJ3259——Wormholes(Bellman-Ford+SPFA)
- I.MX6 Linux 自动获取AR1020 event input节点
- JavaScript高级程序设计15.pdf
- Web学习之自定义标签
- 以excel方式输出数据
- hibernate 使用sql 查询(setResultTransformer)
- photo中的图文混排
- jquery.tmplate使用心得
- 阿里云 Windows Server 2012 r2 部署asp.net mvc网站 平坑之旅
- 【转载】Oracle 中count(1) 、count(*) 和count(列名) 函数的区别
- HTTP请求中 request payload 和 formData 区别?
- Verilog HDL小练习
- sudALSA lib dlmisc.c:236:(snd1_dlobj_cache_get) Cannot open shared library /usr/lib/alsa-lib/libasound_module_pcm_pulse.so
- UVa 514 Rails(栈的应用)