目录

1 策略模式(Strategy)

2 抽象Strategy类

3 具体Strategy类

3.1 加法Strategy类

3.2 减法Strategy类

3.3 乘法Strategy类

3.4 除法Strategy类

4 调试代码

5 调试结果

注:


1 策略模式(Strategy)

意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。

何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。

如何解决:将这些算法封装成一个一个的类,任意地替换。

关键代码:实现同一个接口。

应用实例: 1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。 2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。 3、JAVA AWT 中的 LayoutManager。

优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。

缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。

使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

2 抽象Strategy类

package com.xudongbase.designpattern.strategy;import java.math.BigDecimal;/*** Strategy 模式抽象Strategy类** @author xudongmaster*/
public interface Strategy {/*** 计算** @param num1* @param num2* @return* @throws Exception*/BigDecimal operation(BigDecimal num1, BigDecimal num2) throws Exception;
}

3 具体Strategy类

3.1 加法Strategy类

package com.xudongbase.designpattern.strategy;import org.springframework.stereotype.Component;import java.math.BigDecimal;/*** 加法Strategy类(Strategy 模式具体Strategy类)** @author xudongmaster*/
@Component("add")
public class AddStrategy implements Strategy {/*** 加法计算** @param num1* @param num2* @return* @throws Exception*/@Overridepublic BigDecimal operation(BigDecimal num1, BigDecimal num2) throws Exception {if (num1 == null || num2 == null) {throw new Exception();}return num1.add(num2);}
}

3.2 减法Strategy类

package com.xudongbase.designpattern.strategy;import org.springframework.stereotype.Component;import java.math.BigDecimal;/*** 减法Strategy类(Strategy 模式具体Strategy类)** @author xudongmaster*/
@Component("subtract")
public class SubtractStrategy implements Strategy {/*** 减法计算** @param num1* @param num2* @return* @throws Exception*/@Overridepublic BigDecimal operation(BigDecimal num1, BigDecimal num2) throws Exception {if (num1 == null || num2 == null) {throw new Exception();}return num1.subtract(num2);}
}

3.3 乘法Strategy类

package com.xudongbase.designpattern.strategy;import org.springframework.stereotype.Component;import java.math.BigDecimal;/*** 乘法Strategy类(Strategy 模式具体Strategy类)** @author xudongmaster*/
@Component("multiply")
public class MultiplyStrategy implements Strategy {/*** 乘法计算** @param num1* @param num2* @return* @throws Exception*/@Overridepublic BigDecimal operation(BigDecimal num1, BigDecimal num2) throws Exception {if (num1 == null || num2 == null) {throw new Exception();}return num1.multiply(num2);}
}

3.4 除法Strategy类

package com.xudongbase.designpattern.strategy;import org.springframework.stereotype.Component;import java.math.BigDecimal;/*** 除法Strategy类(Strategy 模式具体Strategy类)** @author xudongmaster*/
@Component("divide")
public class DivideStrategy implements Strategy {/*** 除法计算** @param num1* @param num2* @return* @throws Exception*/@Overridepublic BigDecimal operation(BigDecimal num1, BigDecimal num2) throws Exception {if (num1 == null || num2 == null || num2.equals(BigDecimal.ZERO)) {throw new Exception();}return num1.divide(num2, 13, BigDecimal.ROUND_HALF_DOWN);}
}

4 调试代码

package com.xudongbase.designpattern;import com.xudongbase.designpattern.strategy.Strategy;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.math.BigDecimal;
import java.util.Map;@SpringBootTest
public class StrategyTest {@Autowiredprivate Map<String, Strategy> strategyMap;/*** 测试策略模式** @throws Exception*/@Testpublic void testStrategy() throws Exception {//加法策略模式System.out.println(strategyMap.get("add").operation(new BigDecimal(2), new BigDecimal(4)));//减法策略模式System.out.println(strategyMap.get("subtract").operation(new BigDecimal(2), new BigDecimal(4)));//乘法策略模式System.out.println(strategyMap.get("multiply").operation(new BigDecimal(2), new BigDecimal(4)));//除法策略模式System.out.println(strategyMap.get("divide").operation(new BigDecimal(2), new BigDecimal(4)));}}

5 调试结果

注:

需要查看源码请前往Gitee的xudongbase项目design_pattern分支。

xudongbase: 主要是项目中可以用到的共通方法 - Gitee.comhttps://gitee.com/xudong_master/xudongbase/tree/design_pattern/

设计模式 策略模式(Strategy)介绍和使用相关推荐

  1. 设计模式-策略模式(Strategy)-Java

    设计模式-策略模式(Strategy)-Java 目录 文章目录 1.前言 2.示例案例-电影票打折方案 3.策略模式概述 3.1.策略模式定义 3.2.策略模式结构 3.3.策略模式结构图中角色 3 ...

  2. 解读设计模式----策略模式(Strategy Pattern)

    一.模式概述      策略模式(Strategy Pattern)在外形上与状态模式很相似,但在意图上有些不同.其意图是使这些算法可以相互替换,并提供一种方法来选择最合适的算法.       在我应 ...

  3. 设计模式--策略模式(strategy)

    1.策略模式(strategy ['strætədʒi]) 我的理解是:方案候选模式 (反正关键就是有很多的候选,哈哈) 看了很多例子,都是在说鸭子的,那个例子很好,在这里可以看 他们生产鸭子,我们就 ...

  4. 李建忠设计模式——策略模式Strategy

    目录 1.策略模式定义 1.动机 2.模式定义 3.结构 2.实现例子 1.问题描述 2.代码实现 3.要点总结 4.参考 1.策略模式定义 1.动机 软件构建过程中,某些对象使用的算法可能多种多样, ...

  5. 关于设计模式——策略模式-Strategy Pattern

    文章目录 1 策略模式 1.1 模拟鸭子 1.2 设计原则 1.3 整合行为 1.4 模拟鸭子代码的代码 1.5 动态设定行为 1.6 重新查看整体 1.7 继承和组合 1.8 总结 1.9 优劣期间 ...

  6. 趣谈设计模式 | 策略模式(Strategy):你还在使用冗长的if-else吗?

    文章目录 案例:指挥官AI 策略模式 配合工厂模式 总结 完整代码与文档 案例:指挥官AI 案例可能不符合实际逻辑,仅用于表述设计模式的思想,勿介意 假设我们开发了一款类似全面战争的即时战略游戏,为了 ...

  7. 设计模式——策略模式( Strategy Pattern )

    写代码超过千行,自定义类10个以上,往往写着写着就觉的乱,最终决定抽空补习下设计模式方面的知识.本来AS3出了本关于设计模式的书的,国人也翻译了.我同事也早早买了一本,但前些天我借来看了几页,翻译的太 ...

  8. Java设计模式-策略模式(Strategy)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.策略模式 二.策略模式示例代码 1.支付策略 2.具体支付策略实现 3.策略执行对象 4.测试 总结 前言 本篇介 ...

  9. 设计模式 – 策略模式(Strategy)

    2019独角兽企业重金招聘Python工程师标准>>> 实例:商店促销 (1)首先考虑用简单工厂模式进行设计 Ø  客户端代码Main.java package com.yilong ...

  10. 设计模式 - 策略模式Strategy

    策略模式(Strategy): 定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户. 1 using System; 2 using System.Co ...

最新文章

  1. LeetCode01_二分法专题
  2. Linux下的free命令
  3. 百度地图LBS云存储自定义poi热点
  4. xsd 生成 java 类_如何从Java类生成XSD
  5. 如何做到数百万台车联网设备同时在线 0 故障
  6. php进程池不释放,php-fpm 进程池优化方法
  7. 实现自定义背景色、前景色、显示进度的进度条
  8. 【安全资讯】引爆点:过去2020年勒索软件攻击激增62%
  9. java语言程序设计二级_计算机二级Java语言程序设计试题
  10. JTT1078 + netty + rtmp
  11. STM32/GD32 IAP/Bootloader升级APP研究以及编程实现、hex文件格式
  12. DeepFool论文阅读
  13. elementui表格表头换行
  14. 全球顶尖公司的七大设计理念
  15. 软件规模估算常用的5种方法及实用工具。
  16. LabVIEW中不同颜色连线的含义
  17. 华硕天选 3 和 联想拯救者 Y9000P 2022 款 哪个好
  18. QT常用函数总结(全)
  19. Linux_centos版初学(基础命令)
  20. 一文读懂两台计算机之间是如何通信的

热门文章

  1. android linux 双系统实现(android+buster)同时运行
  2. LAMP虚拟主机架设论坛
  3. 小胡学python【1】
  4. moneybookers api支付接口
  5. Content type ‘application/json;charset=UTF-8‘ not supp...
  6. java 运行器_[原创]我也来做一个最简单的Java2EXE的运行器
  7. Leetcode799. 香槟塔
  8. psp模拟器完美字库_安卓PSP模拟器评测:假面骑士超巅峰英雄
  9. matlab锂电池充电电路,锂离子电池充放电电路模型及其仿真.doc
  10. 网易花19亿买地,要在上海建总部大楼,团队至少2000人