设计模式在业务系统中的应用(1)

简介: 设计模式在业务系统中的应用

image.png



本文的重点在于说明工作中所使用的设计模式,为了能够更好的理解设计模式,首先简单介绍一下业务场景。使用设计模式,可以简化代码、提高扩展性、可维护性和复用性。有哪些设计模式,这里就不再介绍了,网上很多,本文只介绍所用到设计模式。

一  线路检查工具

1  意义

为什么需要线路检查工具呢,有以下几个方面的原因:

  • 每逢大促都需要进行各网络和各行业的线路调整,调整完成之后,是否得到期望状态,需要检查确认。


  • 上下游应用之间数据的一致性检查,如果存在不一致,可能会在订单履行时造成卡单。


  • 有些问题发生后,业务同学需要全面检查一遍线路数据,判断是否符合预期。


  • 各领域之间的数据变更缺乏联动性,导致资源和线路出现不一致。


为什么要把线路检查工具产品化呢,考虑如下:

  • 以前每次大促,都是技术同学现场编写代码捞数据给到业务同学,而且因为人员流动性较大,代码可复用性较低,导致重复劳动。产品化后,可以方便地传承下去,避免不必要的重复劳动。


  • 每次因为时间紧急,现场写的代码都比较简单,经常是直接将数据打印到标准输出,然后复制出来,人工拆分转成Excel格式;这样的过程要进行多次,占用太多技术同学的时间。产品化后,解放了技术同学,业务同学可以自己在页面操作。


  • 很多数据检查,是每次大促都会进行的,业务同学与技术同学之间来回沟通的成本较高。产品化后,可以避免这些耗时耗力的沟通,大家可以把更多的时间放在其他的大促保障工作上。


2  检查项

根据2020年D11进行的数据检查,本次共实现8项,下面列举了4项,如下:

  • 时效对齐检查:确保履行分单正常。


  • 弱控线路与表达网络一致性:确保履行和路由不会因为线路缺失而卡单。


  • 资源映射和编码映射一致:前者是表达线路时所用,后者是订单履约时所用,确保表达和履约能够一致。


  • 检查线路数量:统计现存线路的情况。


好了,了解了背景知识,下面开始介绍所用到的设计模式,以及为什么要用、怎么用。

二  设计模式

1  模板方法模式+泛型

上述8项数据检查工具,大致的处理流程是类似的,如下:


针对不同的检查工具,只有“线路数据检查”这一步是不一样的逻辑,其他步骤都是相同的,如果每个检查工具都实现这么一套逻辑,必定造成大量的重复代码,维护性较差。


模板方法模式能够很好地解决这个问题。模板方法设计模式包含模板方法和基本方法,模板方法包含了主要流程;基本方法是流程中共用的逻辑,如创建检查任务,结果输出等等。


下图是所实现的模板方法模式的类继承关系:



分析如下:

1)DataCheckProductService接口为对外提供的服务,dataCheck方法为统一的数据检查接口。


2)AbstractDataCheckProductService是一个抽象类,设定模板,即在dataCheck方法中设定好流程,包括如下:

  • commonParamCheck方法:进行参数合法性检查,不合法的情况下,直接返回


  • createFileName方法:创建文件名称


  • createTaskRecord方法:创建检查任务


  • runDataCheck方法:进行数据检查,这是一个抽象方法,所有检查工具都要实现此方法,以实现自己的逻辑


  • uploadToOSS方法:将检查结果上传到OSS,便于下载。


  • updateRouteTask方法:结束时更新任务为完成。


dataCheck方法为模板方法,runDataCheck方法由各个子类去实现,其他方法是基本方法。还有一些其他方法,是各个检查工具都需要使用的,所以就放在了父类中。

3)CheckSupplierAndCodeMappingService类、CheckLandingCoverAreaService类和CheckAncPathNoServiceService类为具体的检查工具子类,必须实现runDataCheck方法。

因为不同检查项检的查结果的格式是不一样的,所以使用了泛型,使得可以兼容不同的检查结果。

简化的代码如下:



































































































/** * 数据检查工具产品化对外服务接口 * @author xxx * @since xxx * */public interface DataCheckProductService {    /**     * 数据检查     * @param requestDTO 请求参数     * */  <T> BaseResult<Long> dataCheck(DataCheckRequestDTO requestDTO);}
/** * 数据检查工具产品化服务 * * @author xxx * @since xxx * */public abstract class AbstractDataCheckProductService implements DataCheckProductService {    /**     * 数据检查     * @param requestDTO 请求参数     * @return     * */    @Override    public <T> BaseResult<Long> dataCheck(DataCheckRequestDTO requestDTO){        try{            //1. 参数合法性检查            Pair<Boolean,String> paramCheckResult = commonParamCheck(requestDTO);            if(!paramCheckResult.getLeft()){                return BaseResult.ofFail(paramCheckResult.getRight());            }                        //2. 创建导出任务            String fileName = createFileName(requestDTO);            RouteTaskRecordDO taskRecordDO = createTaskRecord(fileName, requestDTO.getUserName());
            //3. 进行数据检查            List<T> resultList = Collections.synchronizedList(new ArrayList<>());            runDataCheck(resultList, requestDTO);
            //4. 写入文件            String ossUrl = uploadToOSS(fileName,resultList);            //5. 更新任务为完成状态            updateRouteTask(taskRecordDO.getId(),DDportTaskStatus.FINISHED.intValue(), resultList.size()-1,"",ossUrl);
            return BaseResult.ofSuccess(taskRecordDO.getId());        }catch (Exception e){            LogPrinter.errorLog("dataCheck-error, beanName="+getBeanName(),e);            return BaseResult.ofFail(e.getMessage());        }    }
     /**     * 进行数据检查     * @param resultList 存放检查结果     * @param requestDTO 请求参数     * @return     * */    public abstract <T> void runDataCheck(List<T> resultList, DataCheckRequestDTO requestDTO);}
/** * 检查资源映射和编码映射一致 * @author xxx * @since xxx * */public class CheckSupplierAndCodeMappingService extends AbstractDataCheckProductService{    @Override    public <T> void runDataCheck(List<T> resultList, DataCheckRequestDTO requestDTO){        //自己的检查逻辑    }}
/** * 检查区域内落地配必须三级全覆盖 * @author xxx * @since xxx * */public class CheckLandingCoverAreaService extends AbstractDataCheckProductService{    @Override    public <T> void runDataCheck(List<T> resultList, DataCheckRequestDTO requestDTO){        //自己的检查逻辑    }}
/** * 检查资源映射和编码映射一致 * @author xxx * @since xxx * */public class CheckAncPathNoServiceService extends AbstractDataCheckProductService{    @Override    public <T> void runDataCheck(List<T> resultList, DataCheckRequestDTO requestDTO){        //自己的检查逻辑    }}


使用模板方法模式的好处是:

  • 简化了代码,每个工具只需要关心自己的核心检查逻辑,不需要关注前置和后置操作。


  • 提高了扩展性,可以方便地增加新的检查工具。


  • 统一的异常捕获和处理逻辑,子类有异常,尽管往外抛出。
相关文章
|
18天前
|
设计模式 PHP
PHP中的设计模式:单一职责原则在软件开发中的应用
【10月更文挑战第8天】 在软件开发中,设计模式是解决常见问题的经验总结,而单一职责原则作为面向对象设计的基本原则之一,强调一个类应该只有一个引起变化的原因。本文将探讨单一职责原则在PHP中的应用,通过实际代码示例展示如何运用该原则来提高代码的可维护性和可扩展性。
28 1
|
2天前
|
设计模式 存储 数据库连接
PHP中的设计模式:单例模式的深入理解与应用
【10月更文挑战第22天】 在软件开发中,设计模式是解决特定问题的通用解决方案。本文将通过通俗易懂的语言和实例,深入探讨PHP中单例模式的概念、实现方法及其在实际开发中的应用,帮助读者更好地理解和运用这一重要的设计模式。
7 1
|
15天前
|
设计模式 PHP 开发者
PHP中的设计模式:桥接模式的解析与应用
在软件开发的浩瀚海洋中,设计模式如同灯塔一般,为开发者们指引方向。本文将深入探讨PHP中的一种重要设计模式——桥接模式。桥接模式巧妙地将抽象与实现分离,通过封装一个抽象的接口,使得实现和抽象可以独立变化。本文将阐述桥接模式的定义、结构、优缺点及其应用场景,并通过具体的PHP示例代码展示如何在实际项目中灵活运用这一设计模式。让我们一起走进桥接模式的世界,感受它的魅力所在。
|
13天前
|
设计模式 测试技术 持续交付
架构视角下的NHibernate:设计模式与企业级应用考量
【10月更文挑战第13天】随着软件开发向更复杂、更大规模的应用转变,数据访问层的设计变得尤为重要。NHibernate作为一个成熟的对象关系映射(ORM)框架,为企业级.NET应用程序提供了强大的支持。本文旨在为有一定经验的开发者提供一个全面的指南,介绍如何在架构层面有效地使用NHibernate,并结合领域驱动设计(DDD)原则来构建既强大又易于维护的数据层。
31 2
|
18天前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与应用
【10月更文挑战第8天】 在软件开发的浩瀚宇宙中,设计模式如同星辰指引,照亮了代码设计与架构的航道。本文旨在深入探索PHP语境下策略模式(Strategy Pattern)的精髓,不仅剖析其内核原理,还将其融入实战演练,让理论在实践中生根发芽。策略模式,作为解决“如何优雅地封装算法族”的答案,以其独特的灵活性与扩展性,赋予PHP应用以动态变换行为的能力,而无需牵动既有的类结构。
14 2
|
19天前
|
设计模式 缓存 数据库连接
探索PHP中的设计模式:单例模式的实现与应用
在PHP开发中,设计模式是提高代码可复用性、可维护性和扩展性的重要工具。本文将深入探讨单例模式(Singleton Pattern)的基本概念、在PHP中的实现方式以及实际应用场景。单例模式确保一个类仅有一个实例,并提供全局访问点。通过具体代码示例和详细解释,我们将展示如何在PHP项目中有效利用单例模式来解决实际问题,提升开发效率和应用性能。
|
23天前
|
设计模式 存储 测试技术
PHP中的设计模式:单一职责原则在维护性提升中的应用
【10月更文挑战第3天】 在软件开发中,设计模式是解决常见问题的高效方案。本文聚焦于PHP开发,探讨如何运用单一职责原则优化代码结构,提高系统可维护性。通过分析实际案例,本文展示了单一职责原则在降低代码复杂性、增强代码可读性和促进团队协作方面的显著效果。此外,文章还将讨论在实际项目中实施单一职责原则时可能遇到的挑战及应对策略,旨在为PHP开发者提供实用的指导和启示。
28 2
|
27天前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP开发领域,设计模式是解决常见问题的高效方案集合。它们不是具体的代码,而是一种编码和设计经验的总结。单例模式作为设计模式中的一种,确保了一个类仅有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的基本概念、实现方式及其在PHP中的应用。
单例模式在PHP中的应用广泛,尤其在处理数据库连接、日志记录等场景时,能显著提高资源利用率和执行效率。本文从单例模式的定义出发,详细解释了其在PHP中的不同实现方法,并探讨了使用单例模式的优势与注意事项。通过对示例代码的分析,读者将能够理解如何在PHP项目中有效应用单例模式。
|
8天前
|
设计模式 开发者 Python
Python编程中的设计模式应用与实践###
【10月更文挑战第18天】 本文深入探讨了Python编程中设计模式的应用与实践,通过简洁明了的语言和生动的实例,揭示了设计模式在提升代码可维护性、可扩展性和重用性方面的关键作用。文章首先概述了设计模式的基本概念和重要性,随后详细解析了几种常用的设计模式,如单例模式、工厂模式、观察者模式等,在Python中的具体实现方式,并通过对比分析,展示了设计模式如何优化代码结构,增强系统的灵活性和健壮性。此外,文章还提供了实用的建议和最佳实践,帮助读者在实际项目中有效运用设计模式。 ###
10 0
|
19天前
|
设计模式 算法 数据库连接
后端开发中的设计模式应用与实践
在软件开发的广袤天地中,设计模式如同夜空中最亮的星辰,引领着开发者们穿越复杂系统的迷雾。本文旨在通过深入浅出的方式,不仅探讨设计模式的理论精髓,揭示它们在后端架构中的重要性,还将以生动的实践案例,展示如何在实际项目中巧妙运用这些模式。我们邀请您一同踏上这场编程之旅,探索如何借助设计模式的力量,让后端系统更加健壮、灵活且易于维护,共同揭开后端技术神秘面纱的一角。