招聘网站开发手册游戏网络游戏

news/2025/9/23 4:39:40/文章来源:
招聘网站开发手册,游戏网络游戏,wordpress免费编辑器,空中花园做网站的公司java中用策略模式替代if-else的大段逻辑 问题#xff1a; java本来是一门以面向对象为主的语言#xff0c;但很多人嘴上说着java面向对象#xff0c;然后除了表映射实体之外#xff0c;其他的还是面向过程的思路。 就比如今天要说的#xff0c;代码中大段大段的if-else判…java中用策略模式替代if-else的大段逻辑 问题 java本来是一门以面向对象为主的语言但很多人嘴上说着java面向对象然后除了表映射实体之外其他的还是面向过程的思路。 就比如今天要说的代码中大段大段的if-else判断每个if-else代码块中又有很多复杂的逻辑导致整个代码混乱不堪让别人看到就感觉看到屎一样的代码一样。 那么如何优雅的替代这些代码呢其实有个设计模式策略模式就很好的解决了这个问题。 情景举例 比如说订单处理订单会有多个type状态比如说 type1的时候就执行普通订单的逻辑 type2的时候就执行满减促销订单的逻辑 type3的时候就执行满返促销订单的逻辑 等等可能type会有数十种甚至更多种情况。 然后有些人就会开始if-else了比如有如下的伪代码 if(type1){普通订单...此处省略100多行处理逻辑 }else if(type2){满减促销订单...此处省略100多行处理逻辑 }else if(type3){满返促销订单...此处省略100多行处理逻辑 }else if(typen){...此处省略几百上千行的逻辑 }做的好点的会把if-else代码块中的逻辑抽成一个个的方法会稍微显的代码清晰许多但这些都是面向过程的思想。 我认为这种情况就应该用以下这种方式即用策略模式代替if-else真正做到面向对象。 把每种不同类型的订单抽成一个个对象然后通过不同的注解标识来区分调用。 用策略模式代替if-else: 首先本次例子用的是Spring-Boot框架亲测没问题。SpringMVC框架应该也是没问题的。 定义一个订单类里面有type属性type可以是1、“2”、“3”… 定义一个抽象类AbstractHandler里面有个抽象方法handle入参是订单类 定义一个注解HandlerType有个value属性value是几就代表这个注解注的这个类是什么类型的订单 定义普通类HandlerImpl01实现AbstractHandler代表普通订单即HandlerType(“1”) 定义普通类HandlerImpl02实现AbstractHandler代表满减促销订单即HandlerType(“2”) 定义普通类HandlerImpl03实现AbstractHandler代表满返促销订单即HandlerType(“3”) 定义一个初始化类HandlerProcessor实现BeanFactoryPostProcessor过程如下 1、找到带有注解HandlerType的类 2、以注解的值为key对应的类为value存在一个map中 3、将这个map作为构造函数的参数初始化HandlerContext将HandlerContext注册到spring中成为一个单例bean。 很明显目的就是为了保存不同type对应的不同类。 定义类HandlerContext有个map类型的属性叫handlerMap有个getInstance的方法入参是type返回AbstractHandler。 最后使用的时候是先调用handlerContext.getInstance方法根据type获取对应的AbstractHandler。 然后再调用他的handle方法执行对应订单类型的处理逻辑。 具体代码如下 //Data是lombok的注解为了省略不写get/set方法 Data public class OrderDTO {private String code;private BigDecimal price;/*** 订单类型* 1普通订单* 2满减订单* 3满返订单*/private String type; }public abstract class AbstractHandler {abstract public String handle(OrderDTO orderDTO); }Target({ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Documented Inherited public interface HandlerType {String value(); }Component HandlerType(1) public class HandlerImpl01 extends AbstractHandler {Overridepublic String handle(OrderDTO orderDTO) {System.out.println(处理type为1的订单,orderDTO.typeorderDTO.getType());return success;} }Component HandlerType(2) public class HandlerImpl02 extends AbstractHandler {Overridepublic String handle(OrderDTO orderDTO) {System.out.println(处理type为2的订单,orderDTO.typeorderDTO.getType());return success;} }Component HandlerType(3) public class HandlerImpl03 extends AbstractHandler {Overridepublic String handle(OrderDTO orderDTO) {System.out.println(处理type为3的订单,orderDTO.typeorderDTO.getType());return success;} }Component SuppressWarnings(unchecked) public class HandlerProcessor implements BeanFactoryPostProcessor {//这里是具体的handler策略类的包的位置为了后面的包扫描private static final String HANDLER_PACKAGE com.zs.handler;Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {MapString, Class handlerMap new HashMap();//包扫描ClassScaner.scan(HANDLER_PACKAGE,HandlerType.class).forEach(clazz -{Annotation annotation clazz.getAnnotation(HandlerType.class);HandlerType handlerType (HandlerType) annotation;String type handlerType.value();System.out.println(type);handlerMap.put(type,clazz);});HandlerContext handlerContext new HandlerContext(handlerMap);//注册单例beanFactory.registerSingleton(HandlerContext.class.getName(),handlerContext);} }public class HandlerContext {private MapString,Class handlerMap;public HandlerContext(MapString, Class handlerMap) {this.handlerMap handlerMap;}public AbstractHandler getInstance(String type){Class clazz handlerMap.get(type);if(clazz null){throw new IllegalArgumentException(没有type对应的处理器typetype);}return (AbstractHandler)SpringContextUtils.getBean(clazz);} }定义接口 public interface OrderService {/*** 根据订单类型处理订单* param orderDTO* return*/String handle(OrderDTO orderDTO); }实现接口 Service public class OrderServiceImpl implements OrderService {Resourceprivate HandlerContext handlerContext;Overridepublic String handle(OrderDTO orderDTO) {System.out.println(OrderServiceImpl handle 方法开始执行);AbstractHandler handler handlerContext.getInstance(orderDTO.getType());return handler.handle(orderDTO);} }包扫描的工具类 public class ClassScaner implements ResourceLoaderAware {private ResourcePatternResolver resourcePatternResolver new PathMatchingResourcePatternResolver();private final ListTypeFilter includeFilters new LinkedListTypeFilter();private final ListTypeFilter excludeFilters new LinkedListTypeFilter();private MetadataReaderFactory metadataReaderFactory new CachingMetadataReaderFactory(this.resourcePatternResolver);public ClassScaner() {}public void setResourceLoader(ResourceLoader resourceLoader) {this.resourcePatternResolver ResourcePatternUtils.getResourcePatternResolver(resourceLoader);this.metadataReaderFactory new CachingMetadataReaderFactory( resourceLoader);}// public final ResourceLoader getResourceLoader() { // return this.resourcePatternResolver; // }public void addIncludeFilter(TypeFilter includeFilter) {this.includeFilters.add(includeFilter);}// public void addExcludeFilter(TypeFilter excludeFilter) { // this.excludeFilters.add(0, excludeFilter); // }// public void resetFilters(boolean useDefaultFilters) { // this.includeFilters.clear(); // this.excludeFilters.clear(); // }public static SetClass scan(String basePackage, Class? extends Annotation... annotations) {ClassScaner cs new ClassScaner();for (Class anno : annotations)cs.addIncludeFilter(new AnnotationTypeFilter(anno));return cs.doScan(basePackage);}// public static SetClass scan(String[] basePackages, Class? extends Annotation... annotations) { // ClassScaner cs new ClassScaner(); // for (Class anno : annotations) // cs.addIncludeFilter(new AnnotationTypeFilter(anno)); // SetClass classes new HashSetClass(); // for (String s : basePackages) // classes.addAll(cs.doScan(s)); // return classes; // }public SetClass doScan(String basePackage) {SetClass classes new HashSetClass();try {String packageSearchPath ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX org.springframework.util.ClassUtils.convertClassNameToResourcePath(SystemPropertyUtils.resolvePlaceholders(basePackage)) /**/*.class;Resource[] resources this.resourcePatternResolver.getResources(packageSearchPath);for (int i 0; i resources.length; i) {Resource resource resources[i];if (resource.isReadable()) {MetadataReader metadataReader this.metadataReaderFactory.getMetadataReader(resource);if ((includeFilters.size() 0 excludeFilters.size() 0)|| matches(metadataReader)) {try {classes.add(Class.forName(metadataReader.getClassMetadata().getClassName()));} catch (ClassNotFoundException e) {e.printStackTrace();}}}}} catch (IOException ex) {throw new BeanDefinitionStoreException(I/O failure during classpath scanning, ex);}return classes;}protected boolean matches(MetadataReader metadataReader) throws IOException {for (TypeFilter tf : this.excludeFilters) {if (tf.match(metadataReader, this.metadataReaderFactory)) {return false;}}for (TypeFilter tf : this.includeFilters) {if (tf.match(metadataReader, this.metadataReaderFactory)) {return true;}}return false;} }spring工具类为了获取bean Component public class SpringContextUtils implements ApplicationContextAware {private static ApplicationContext applicationContext null;public static ApplicationContext getApplicationContext(){return applicationContext;}SuppressWarnings(unchecked)public static T T getBean(String beanId) {return (T) applicationContext.getBean(beanId);}public static T T getBean(ClassT requiredType) {return (T) applicationContext.getBean(requiredType);}Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {SpringContextUtils.applicationContext applicationContext;} }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/911377.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

佛山新网站建设如何网站设计计划

RGB转灰度函数 cvtColor(image, gray, COLOR_BGR2GRAY); 图像 目标图像 rgb转灰度 大津法二值化函数 threshold(gray, result1, 84, 255, THRESH_OTSU); 灰度图,目标图,阈值,大于阈值的转换的像素值,方法为大津法 自适应二值…

工业设计网站知乎重庆本地建站

在当今数字化时代,服务器扮演着重要的角色,为企业、组织和个人提供各种网络服务。然而,服务器也成为了网络攻击者的目标之一,可能面临各种安全威胁,例如DDoS攻击、恶意软件攻击、数据泄露等。为了有效地防范服务器被攻…

阿里去要企业网站建设方案书如何看网站是用什么语言做的

一、部署Mysql 需求: 在Docker容器中部署MySQL,并通过外部mysql客户端操作MySQLServer。 二、部署tomcat 三、部署nginx 四、部署redis

网站建设 凡科如何做的网站手机可以用

文章目录 1.设计来源1.1 书本正面1.2 界面1-21.3 界面3-41.4 界面5-61.5 界面7-81.6 界面9-101.7 界面11-121.8 书本结尾 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/1…

国际域名注册证书企业网站优化设计应该把什么放在首位

RBD 方式的 工作 流程: 1、客户端创建一个pool,并指定pg数量,创建 rbd 设备并map 到文件系统; 2、用户写入数据,ceph进行对数据切块,每个块的大小默认为 4M,每个 块名字是 object序号&#xff…

怎么建立一个网站放图片国内网站设计案例欣赏

INI 配置之前章节我们已经接触过一些 INI 配置规则了,如果大家使用过如 Spring 之类的 IoC/DI 容器的话,Shiro 提供的 INI 配置也是非常类似的,即可以理解为是一个 IoC/DI 容器,但是区别在于它从一个根对象 securityManager 开始。…

松江品划企业网站建设h5制作软件教程

系列简介:这个系列文章讲解线性代数的基础内容,注重学习方法的培养。线性代数课程的一个重要特点(也是难点)是概念众多,而且各概念间有着千丝万缕的联系,对于初学者不易理解的问题我们会不惜笔墨加以解释。在内容上,以…

驾校网站建设费用怎么自己做网站

2019独角兽企业重金招聘Python工程师标准>>> Lori Macvittie 微服务架构是把双刃剑,我们享受它带来的开发速度(development velocity),却也不得不面对服务间通讯带来的复杂性问题。 目前大多数扩展容器化微服务的架构多…

网站速度诊断中国北京出啥大事了

1. 进程与线程有那些区别和联系?   每个进程至少需要一个线程。 进程由两部分构成:进程内核对象,地址空间。线程也由两部分组成:线程内核对象,操作系统用它来对线程实施管理。线程堆栈,用于维…

网站页面设计论文长沙做网站最好的公司

摘要:CSS 过渡效果是一种常见的美观技术,用于在元素状态变化时平滑地过渡。本文将详细介绍 CSS 过渡效果的语法、属性、使用场景以及实现动画效果的步骤。 一、CSS 过渡效果概述 CSS 过渡效果是一种改变元素属性的视觉效果,使得从一个状态到另…

简述网站设计基本流程外贸建站 台州

关于自定义循环队列的实现原理和要点可以参见之前的博文系列:循环队列及C语言实现。这里主要对JAVA下的具体实现方式与原理进行说明。 一、JAVA 中已经自带了 Queue、DQueue、ArrayList、LinkedList 等常用的数据结构,为什么还要单独实现循环队列&#…

淄博 网站设计小鸟云WordPress数据库连接

背景:用nohup运行jar包时候,会产生大量的日志文件,影响磁盘存储,生产环境大概1天有30个g 解决方案: 1、用split分割日志,代码在下面(可以先测试一下),然后加入到定时任务…

常德自助建站seo哈尔滨怎样快速建站

现象: 在CodeFirst时,先写字段与表,创建数据库后,再添加内容 但字段与表会变更,比如改名删除增加等 需求: 当表字段变更时,同时变更数据库,执行数据库迁移 核心命令 Add-Migrat…

什么是 网站收录广州申请公司注册网站

738.单调递增的数字 思路:要求一个数字从第一位往后的大小是单调递增的,先把数字转换成字符串,然后从后往前逐位遍历,如果当前位比前一位小,则前一位--,从当前位往后都应该为9,因此记下当前位置…

html做的网页怎么变成网站手机商城网站建设策划方案范文

汇编概述 汇编需要学习的大致框架如下: 汇编中的符号 1.指令;能够北嘁肷梢惶?2bit机器码,并且能够被cpui识别和执行 2.伪指令:本身不是指令,编译器可以将其替换成若干条指令 3.伪操作:不会生成指令…

网站怎么产品做推广做暧暧网站在线看

Python3判断是否为回文数原题 https://leetcode-cn.com/problems/palindrome-number/ 题目: 不允许用str的方法! 判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。…

基于 Vite7 与 Vue3 的 WebOS 后台系统架构实践

在数字办公场景日益复杂的今天,企业级后台系统对交互体验与开发效率提出更高要求。我们采用 Vite7+Vue3+ArcoDesign 技术组合,构建出兼具 MacOS 与 Windows 双风格的 WebOS 管理系统模板,为 PC 端后台开发提供全新解…

网站优化流程网站备案幕

代码随想录算法训练营Day47 | 198.打家劫舍 213.打家劫舍II 337.打家劫舍III LeetCode 198.打家劫舍 题目链接&#xff1a;LeetCode 198.打家劫舍 思路&#xff1a; 当前打劫或者不打劫 class Solution { public:int rob(vector<int>& nums) {vector<int>…

网站建设和推广电话销售话术王也图片高清头像

在前几篇笔记之中都是使用的GPIO输出功能&#xff0c;还没有用过GPIO输入功能&#xff0c;本章就来学习一下如果在Linux下编写GPIO输入驱动程序。正点原子STM32MP1开发板上有三个按键&#xff0c;就使用这些按键来完成GPIO输入驱动程序&#xff0c;同时利用原子操作来对按键值进…

广东网站设计公司电话h5应用

图片来源&#xff1a;https://cn.bing.com本文系生物谷原创编译&#xff0c;欢迎分享&#xff0c;转载须授权&#xff01;研究人员发现了一种直接将皮肤细胞重新编程成用于视觉的光敏杆状感光器的技术。实验室制造的杆状体使失明的老鼠能够在细胞移植到眼睛后探测到光线。这项研…