博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式-策略模式
阅读量:4163 次
发布时间:2019-05-26

本文共 2467 字,大约阅读时间需要 8 分钟。

文章目录

应用场景

策略模式侧重点是一个行为多个算法的实现,可互换算法。

简单来说,不同类型走不同的算法,可以避免冗长的if else,实现横向扩展。

比如电商网站下单,不同订单有不同的算法,但它们有一个共同点:对订单进行计算处理。属于同一个行为,但是订单类型不同。

实现方式

可能我们首先想到的是使用if else,写出下面的方法:

if (orderType.equals("computer")) {
//电脑订单的算法} else if (orderType.equals("food")) {
//食物订单的算法} else {
//其他类型订单的算法}

这种写法,如果后续新增很多订单算法,那么必须修改这里的代码!

根据设计模式原则,我们需要隔离变化的,让其他部分不受它的影响,因此我们对此进行改进,这时就需要用到面向接口编程!

类图

在这里插入图片描述

  • 定义一个接口类OrderHandler
  • 实现OrderHandler的有两个具体的订单计算类
  • OrderController是使用者,一定会持有OrderHandler接口变量

代码实现

以下代码有些和类图命名方式不一样,不过原理都是相同的。

OderHandler接口类:

public interface OrderHandler {
boolean support(String orderType); void handler();}

Computer订单实现类:

@Componentpublic class ComputerOrderHandlerImpl implements OrderHandler {
public static String ORDER_TYPE = "computer"; @Override public boolean support(String orderType) {
return orderType.equals(ComputerOrderHandlerImpl.ORDER_TYPE); } @Override public void handler() {
System.out.println("策略模式:调用ComputerOrderHandler进行处理"); }}

Food订单实现类

@Componentpublic class FoodOrderHandlerImpl implements OrderHandler {
public static String ORDER_TYPE = "food"; @Override public boolean support(String orderType) {
return orderType.equals(FoodOrderHandlerImpl.ORDER_TYPE); } @Override public void handler() {
System.out.println("策略模式:调用FoodOrderHandler进行处理"); }}

外部使用类:

@Controller@RequestMapping("/strategy")public class StrategyTestController {
@RequestMapping("/test.json") @ResponseBody public String test() {
String orderType = "computer"; //获取所有类型为OrderHandler.class的类 Map
beansMap = SpringContextUtil.getApplicationContext().getBeansOfType(OrderHandler.class); //处理 for (Map.Entry
entry : beansMap.entrySet()) {
if (entry.getValue().support(orderType)) {
//调用对应的订单类型处理类 entry.getValue().handler(); } } return "strategy success"; }}

SpringContextUtil工具类:

@Componentpublic class SpringContextUtil implements ApplicationContextAware{
private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextUtil.applicationContext = applicationContext; } public static ApplicationContext getApplicationContext() {
return applicationContext; }}

转载地址:http://bwpxi.baihongyu.com/

你可能感兴趣的文章
Xcode 11 报错,提示libstdc++.6 缺失,解决方案
查看>>
vue项目打包后无法运行报错空白页面
查看>>
Vue 解决部署到服务器后或者build之后Element UI图标不显示问题(404错误)
查看>>
element-ui全局自定义主题
查看>>
facebook库runtime.js
查看>>
js报错显示subString/subStr is not a function
查看>>
高德地图js API实现鼠标悬浮于点标记时弹出信息窗体显示详情,点击点标记放大地图操作
查看>>
vue项目使用安装sass
查看>>
在osg场景中使用GLSL语言——一个例子
查看>>
laravel 修改api返回默认的异常处理
查看>>
laravel事务
查看>>
【JavaScript 教程】浏览器—History 对象
查看>>
这才是学习Vite2的正确姿势!
查看>>
7 个适用于所有前端开发人员的很棒API,你需要了解一下
查看>>
隐藏搜索框:CSS 动画正反向序列
查看>>
【视频教程】Javascript ES6 教程27—ES6 构建一个Promise
查看>>
【5分钟代码练习】01—导航栏鼠标悬停效果的实现
查看>>
127个超级实用的JavaScript 代码片段,你千万要收藏好(中)
查看>>
127个超级实用的JavaScript 代码片段,你千万要收藏好(下)
查看>>
Flex 布局教程:语法篇
查看>>