详解Java如何优雅的使用策略模式
初念初恋 人气:0最近这段时间,想给大家分享一下设计模式的一些用法以及在项目中怎么运用。
设计模式是软件设计中常见问题的典型解决方案。 它们就像能根据需求进行调整的预制蓝图, 可用于解决代码中反复出现的设计问题。
今天就拿其中一个问题来分析,使用策略模式来解决问题,没有了解过策略模式或者长时间不用已经忘了策略模式的小伙伴先来简单了解一下策略模式吧。
什么是策略模式
策略模式是一种行为型模式,它将对象和行为分开,将行为定义为 一个行为接口 和 具体行为的实现。策略模式最大的特点是行为的变化,行为之间可以相互替换。每个if判断都可以理解为就是一个策略。本模式使得算法可独立于使用它的用户而变化。
简单理解就是,针对不同的场景,使用不同的策略进行处理。
策略模式结构
- Strategy 接口定义了一个算法族,它们都实现了 behavior() 方法。
- Context 是使用到该算法族的类,其中的 doSomething() 方法会调用 behavior(),setStrategy(Strategy) 方法可以动态地改变 strategy 对象,也就是说能动态地改变 Context 所使用的算法。
策略模式适用场景
- 如果在一个系统里面有许多类,它们之间的区别仅在于它们 的行为,那么使用策略模式可以动态地让一个对象在许多行 为中选择一种行为。
- 一个系统需要动态地在几种算法中选择一种。
- 如果一个对象有很多的行为,如果不用恰当的模式,这些行 为就只好使用多重的条件选择语句来实现。
- 不希望客户端知道复杂的、与算法相关的数据结构,在具体策略类中封装算法和相关的数据结构,提高算法的保密性与安全性。
生活中比较常见的应用模式有:
- 电商网站支付方式,一般分为银联、微信、支付宝,可以采用策略模式。
- 电商网站活动方式,一般分为满减送、限时折扣、包邮活动,拼团等可以采用策略模式。
简单示例
场景:最近太热了,想要降降温,有什么办法呢
首先,定义一个降温策略的接口
public interface CoolingStrategy { /** * 处理方式 */ void handle(); }
定义3种降温策略;实现策略接口
public class IceCoolingStrategy implements CoolingStrategy { @Override public void handle() { System.out.println("使用冰块降温"); } }
public class FanCoolingStrategy implements CoolingStrategy { @Override public void handle() { System.out.println("使用风扇降温"); } }
public class AirConditionerCoolingStrategy implements CoolingStrategy { @Override public void handle() { System.out.println("使用空调降温"); } }
定义一个降温策略的上下文
public class CoolingStrategyContext { private final CoolingStrategy strategy; public CoolingStrategyContext(CoolingStrategy strategy) { this.strategy = strategy; } public void coolingHandle() { strategy.handle(); } }
测试
public class Main { public static void main(String[] args) { CoolingStrategyContext context = new CoolingStrategyContext(new FanCoolingStrategy()); context.coolingHandle(); context = new CoolingStrategyContext(new AirConditionerCoolingStrategy()); context.coolingHandle(); context = new CoolingStrategyContext(new IceCoolingStrategy()); context.coolingHandle(); } }
运行结果:
使用风扇降温
使用空调降温
使用冰块降温
加载全部内容