在项目的开发中,我们很难做到开发一套标准的流程来解决所有客户的需求。比如,我们当前的计量项目,分别运行于赤峰市和河北省。虽然两个区域处理的业务相同,但是对细节的实现要求却不同。前面也学习过计量检定软件,其为了解决各个定制者使用的功能需求,最后采取的方案是:将基础项目复制多份,进而满足不同的客户需求。优点当然是有的,但比起缺点来,优点便不值一提。缺点很明显,总结为一句话就是:项目变得难以维护。所以,当前让我们看到的就是,几个开发人员,每天处于解决问题当中。本文将给出一种方案,来有效的规避上述问题。
资源与环境
开发环境:java1.8 + spring-boot:2.1.3.RELEASE
需求假设
- 假设使用本项目的人员为:中国人、美国人,分别能接受的语言为中文和英文。
- 项目运行后,可以根据当前的访问人员是国籍来动态显示: 你好 或 hello
- 有新的需求后,比如:增加德国人并显示 Hallo 。增加功能时,不更改核心代码。
- 不使用if else
注意:如果你看完需求假设后,毫无触动,请忽略本文以下内容
解决方案
解决方案中,我们涉及了两种设计模块,分别为: 策略模式 及 工厂模式 。
策略模式:一般用于将具体的 算法 进行抽象及剥离。此项目中,我们的具体算法是 说你好 。
工厂模式:一般用于根据环境来动态的创建BEAN的情况下。引项目中,我们将根据不同国家的人,来返回不同的 说你好 这个算法。
先给出UML图:
SpeakService
SpeakService 即为我们供其它模块调用的 说话服务 ,调用其中的 SayHello() 来完成 说你好功能。
package com.mengyunzhi.demo.dynamicautowire; /** * 你好 */ public interface SpeakService { void sayHello(); }
在其实现类中,我们注入 SayHelloFactory ,让其来返回正确的 SayHelloService ,最终调用 sayHello() 来完成目标。
package com.mengyunzhi.demo.dynamicautowire; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * 你好 */ @Servi