策略模式之Map+函数式接口

简介: 关于策略模式的介绍,优缺点,常规实现方式,以及适用于jdk 1.8的最简单实现方式

策略模式之Map+函数式接口

1.什么是策略模式

策略模式在设计模式中属于行为型模式。他指同一个事情中某些行为或者算法,随着条件的不同,而发生变化。

也就是说,为完成同一件事情,有很多不同的实现方式。我们将这些不同的方式,封装成一个个独立的方法或者类,根据不同的条件触发他,这就是策略模式。

在日常生活中,有很多例子描述策略模式:

去旅行,我们交通方式可以是走路,开车,坐火车,坐飞机,各种各样的方式,都实现了到旅行地的目的。

扫码支付,我们可以使用微信,支付宝,云闪付,不同的手段,也都实现了付款的目的。

2.为什么要使用策略模式

主要解决问题

策略模式主要解决的是如何组织、调用算法,从而让程序结构更灵活、具有更好的维护性和扩展性

优点:

  • 算法,行为可以自由定义,自由切换
  • 避免使用多重条件判断语句
  • 扩展性良好

3.怎么使用策略模式

常规实现策略模式的方法,有多种多样:注解式,工厂方法式等。

1.工厂方法实现策略模式

以旅行为例:

1.首先定义旅行行为接口publicinterfaceTravel {
voidgo();
}
2.定义旅行方式工厂publicclassTravelStrategyFactory {
privatestaticMap<String, Travel>map=newHashMap<>();
publicstaticvoidregister(Stringcode, Traveltravel) {
if (StringUtils.isNotEmpty(code)) {
map.put(code, travel);
        }
    }
publicstaticTravelget(Stringcode) {
returnmap.get(code);
    }
}
3.实现旅行行为逻辑//火车出行publicclassTrainimplementsTravel{
@PostConstructpublicvoidinit(){
TravelStrategyFactory.register("train",this);
    }
@Overridepublicvoidgo() {
System.out.println("火车");
    }
}
//步行出行publicclassWalkimplementsTravel{
@PostConstructpublicvoidinit(){
TravelStrategyFactory.register("walk",this);
    }
@Overridepublicvoidgo() {
System.out.println("步行");
    }
}
4.出去旅游publicstaticvoidmain(String[] args) {
TravelStrategyFactory.get("train").go();
}

以上就是一个完整策略模式实现,代码很简洁,逻辑清晰,扩展性很好,但是他也有几个缺点:

1.他的扩展性,强制必须新建类,来实现不同的行为,一旦行为过多,类文件就会比较多

2.这种方式没有一个地方可以对全局业务做到俯视,各自为战,有时候,很容易出错

2.Map+函数式接口实现策略模式(建议使用)

Map+函数式接口采用jdk 1.8的函数式编程的新特性,用来实现策略模式,更加简单,更加自由。

同样以旅行为例:

publicclassStrategy {
@AutowiredprivateTravelServicetravelService;
//有返回值用Function接口,无返回值用Consumer接口privateMap<Integer, Consumer<String>>typeMap=newHashMap<>();
@PostConstructpublicvoiddispatcherInit(){
typeMap.put("walk", id->travelService.walk(id));
typeMap.put("train", id->travelService.train(id));
    }
publicstaticvoidmain(String[] args) {
Consumer<String>consumer=typeMap.get("walk");
if(Objects.nonNull(consumer)){
consumer.accept("id");
        }
    }
}
publicclassTravelService {
publicvoidwalk(Stringid) {
System.out.println("步行");
    }
publicvoidtrain(Stringid) {
System.out.println("步行");
    }
}

可以看到这种方式比传统策略模式,实现起来简单好理解,扩展起来非常自由,可以使用inteface扩展,也可以调服务方法执行对应逻辑,并且在定义策略的时候,可以看到所有策略情况,便于对业务全局进行把控。

相关文章
|
2月前
|
存储 算法 Java
滚雪球学Java(65):深入理解Java中的Map接口:实现原理剖析
【6月更文挑战第19天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
25 3
滚雪球学Java(65):深入理解Java中的Map接口:实现原理剖析
|
2月前
|
安全 Java
|
3月前
|
存储 Java
【JAVA学习之路 | 进阶篇】Map接口及其实现类及常用方法
【JAVA学习之路 | 进阶篇】Map接口及其实现类及常用方法
|
3月前
|
Java
Map+函数式接口
Map+函数式接口
|
3月前
|
存储 安全 Java
Java的Map接口及其实现类的技术性文章
Java的Map接口及其实现类的技术性文章
18 0
|
3月前
|
存储 安全 Java
Java list set map等接口及其实现类
Java list set map等接口及其实现类
|
3月前
|
存储 安全 Java
[Java基础面试题] Map 接口相关
[Java基础面试题] Map 接口相关
|
3月前
|
存储 安全 Java
Java一分钟之-Map接口与HashMap详解
【5月更文挑战第10天】Java集合框架中的`Map`接口用于存储唯一键值对,而`HashMap`是其快速实现,基于哈希表支持高效查找、添加和删除。本文介绍了`Map`的核心方法,如`put`、`get`和`remove`,以及`HashMap`的特性:快速访问、无序和非线程安全。讨论了键的唯一性、`equals()`和`hashCode()`的正确实现以及线程安全问题。通过示例展示了基本操作和自定义键的使用,强调理解这些概念对编写健壮代码的重要性。
26 0
|
3月前
|
存储 安全 Java
Java Map接口及其常用实现类详解
Java Map接口及其常用实现类详解
104 1
|
9月前
|
Java 数据库
Map+函数式接口方法解决if-else
Map+函数式接口方法解决if-else