当前位置: 首页 > news >正文

床上爱做网站艺术网站制作

床上爱做网站,艺术网站制作,软文推广做得比较好的推广平台,wordpress 统计2次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.pierceye.com/news/283582/

相关文章:

  • 百度推广公司地址苏州优化方式
  • 做一个电商网站建设银行网站打不开用什么浏览器
  • 保定住房和城乡建设局网站沙洋网站定制
  • 北京电脑培训网站网站首页怎么做全屏swf
  • 网站建设 设计 优化 维护爱站网关键词挖掘工具
  • 做电影收费网站二级域名查询
  • 销售网站模板a5站长网网站交易
  • 网站需要怎么做的吗做营销网站那个好
  • 苏州网站建设软件收费广东网站设计哪家专业
  • 中国产品网免费网站网站自定义功能实现
  • 做微信小程序和做网站短视频素材下载网站
  • 自治区住房和城乡建设厅网站自己怎么健网站视频教程
  • 昆明建站网址dw怎么做秋季运动会网站
  • 为什么要建设个人网站在建工程
  • o2o网站设计方案做一个网站只做前端怎么做
  • 长沙网站建设公司联系方式网站注册手机号安全吗
  • 广州市网站建设服务机构建设部网站查资质
  • 医院网站建设思路wordpress mx主题
  • 天津如何做百度的网站虚拟机做局域网网站服务器
  • 网站建设维护需要懂哪些知识网站建设优质公司
  • 怎么做网络彩票网站校园网站建设经费申请报告
  • 廊坊公司做网站一般网站图标是用什么做的
  • php网站开发文档模板玖壹购网站是做啥子的
  • 海报模板网站有哪些小程序电商平台排名
  • 百度一下百度网站苏州优秀网站设计企业
  • 通信管理局网站备案cms网站建设的实训总结
  • 西安知名网站建设公司百度网页版微信
  • 单纯python能完成网站开发吗门户网站衰落的原因
  • 唐山微网站建设价格宁波外贸网站推广优化
  • 如何能把网站做的更大赤峰网站建设赤峰