设计模式系列:策略模式

本文介绍了策略模式,它是一种行为模式,能在运行时动态改变类的行为,可减少代码中if else的冗余。通过小明爬武功山选择出行工具的案例,阐述了策略模式的实现,包括定义接口、实现算法、编写助手类和测试类。还指出其优点是扩展性好,缺点是可能导致“类爆炸”,策略过多时可考虑混合模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  前言

  策略模式是一种行为模式,它用以运行时动态的改变类的行为,通过将一系列类似的算法封装成不同的类来达到目的,可以有效减少代码中if else的冗余。它实现的关键是面向接口接口编程以及有一个算法切换者。它的优点是扩展性良好,可以自由切换策略。

  栗子

  周末天气不错,小明准备去爬武功山,于是他请教它的出行助手应该选择怎样的工具去目的地才能让他最大化周末的快乐。于是它的出行助手开始了一段计算,操作。。。最终。。。

  抽象

  针对上面的案例,重点在于出行助手如何帮小明选择出行工具,这恰好可以对应我们一开始说的需要封装的算法,并且能够随意切换,于是我们可以得出下面的uml类图:

  

Strategy

 

  小明通过使用出行助手来选择不同的交通工具。而出行助手内部则通过代理TravelStrategy接口来切换不同的出行算法。

  实现

  首先定义出行接口TravelStrategy:

  @FunctionalInterface

  public interface TravelStrategy {

  void travel();

  }

  接着实现不同的出行算法,此处有BikeTravelStrategy, FootTravelStrategy, CarTravelStrategy。

  

 

  接着就需要实现出行助手类:TravelService,它内部通过代理TravelStategy来切换不同的策略:

  

 

  

  最后,编写一个测试类:

  

 

  注意上面的关键代码为TravelService根据不同的天气选择了不同的出行策略。

  

 

  根据结果我们可以知道我们切换了三次不同的策略,并且使用lambda表达式添加了一个匿名策略。

  总结

  使用策略模式的关键在于面向接口编程,并且有一个全局切换策略的辅助类,它的优点在于扩展性良好,算法可以自由切换动态改变类的行为。

  而它的缺点也很明显:策略类过多会导致“类爆炸“,并且所有的策略类都需要向外暴露。 所以使用时如果策略过多可以考虑使用混合模式,配合其它模式一起使用。

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值