设计模式综和实战项目x-gen系列二

1  详细功能

1.1  详细功能

配置管理模块的主要功能是:

1:获取用户配置的数据,配置的方式很多,要求除了框架自身提供的配置方式外,还要能支持用户自定义的配置方式。比如:框架本身提供默认的配置方式为xml配置,如果用户想使用数据库来配置,那么框架必须能够支持用户自定义一种数据库配置的方式

2:缓存用户配置的数据,同一份配置数据,在运行期间会多次使用,但是获取用户配置数据的动作就只需要一次就可以了,获取过后,就缓存下来。

3:对外提供接口,让其他模块通过这些接口来获取他们需要的数据

1.2  功能边界

配置管理模块的主要功能就是获取用户配置的数据,然后保管好这些数据,并提供这些数据让模块外部访问。

配置管理模块不关心被访问的数据是怎么来的,它只是按照访问方式去获取这些数据,当然不同的数据格式有不同的访问方式。

虽然需要支持自定义配置方式,但是需要配置的数据是一定的,只是配置的格式不同,访问这些配置数据的方式不同,但最后殊途同归,都想配置管理模块提供相应的数据。因此这个需要配置的数据项是要统一起来的。

配置管理模块不关心获取到的数据是什么,也不关心这些数据的含义,更不关心这些数据怎么用,它只是负责获取这些数据并保存起来。

配置管理模块不关心谁来使用这些数据,也不关心外部获取这些数据后如何使用,它只是负责提供这些数据而已

2  模块对外接口

2.1  对外数据接口设计

目前设计的配置分成三类,虽然配置的方式不固定,但是对于核心框架而言,有一些数据是必需要配置的,所以还是需要设计对外的数据接口。

为了简单,这里以xml为例子来说明定义的数据结构。但是请注意,x-gen框架并不局限于使用xml作为配置的方式,同样你可以选用properties文件、数据库等其他的配置方式。

虽然配置方式不同,需要配置的数据却是一样的,所以,你可以把这里xml描述的配置数据改成任何你希望使用的配置方式相对应的数据结构。

第一类是核心框架运行需要的数据

以xml配置为例,默认取名为GenConf.xml,在每次使用的时候根据需要修改或配置其内容。当然,为了示例简单,就不去做dtd或者schema了。具体示例如下:


<?xml version="1.0" encoding="UTF-8"?>

<GenConf>

<NeedGens>

<NeedGen id="UserGenConf" provider="XmlModuleGenConf" themeId="simple">

<Params>

<Param id="fileName">UserGenConf.xml</Param>

</Params>

</NeedGen>

</NeedGens>

<Themes>

<Theme id="simple">cn/javass/themes/simple</Theme>

</Themes>

<Constants>

<Constant id="prePackage" value="cn.javass"></Constant>

<Constant id="projectName" value="framework"></Constant>

</Constants>

</GenConf>

节点说明如下:

(1)<GenConf>是根节点

(2)<NeedGens> :用来注册需要generate的模块的配置,里面可以注册很多个需要generate的模块

(3)<NeedGen> :需要generate的一个模块,属性含义如下:

? Id:需要generate的模块的标识名称或编号,必须唯一

? provider:用来获取该模块配置数据的程序的标识,该标识对应的实现类定义,在该模块使用的theme里面配置

? themeId:该模块生成的时候具体使用的theme的标识

(4)<Params>:参数,通常是根据不同的provider,提供不同的参数配置,每个参数配置都包括参数标识和具体的参数值

(5)<Param>:具体一个参数的配置,值就是参数的值,属性如下:

? Id:参数的标识名称或编号,必须唯一

(6)<Themes>:用来注册generate所需要的外部theme,可以配置多个<Theme>

(7)<Theme>:具体的描述一个theme,theme存放的具体位置,可以配置一个相对路径,配置到theme存放的根文件夹即可,属性如下:

? Id:theme的标识名称或编号,必须唯一

(8)<Constants>:常量定义,可以配置多个常量

(9)<Constant>:单个常量定义,值就是常量的值,属性为:

? id :常量的标识名称或编号,必须唯一

第二类是用户需要生成的模块的配置数据

比如:用户想要生成一个模块内的增删改查的源代码,里面有每个具体功能的配置,而每个具体功能就是一个源代码文件。

这个也需要在每次使用的时候根据需要来配置,并注册到核心框架运行配置里面去,每次生成主要配置的就是这类数据。

示例如下:


<?xml version="1.0" encoding="UTF-8"?>

<ModuleGenConf>

<ModuleName>UserConf</ModuleName>

<NeedGenTypes>

<NeedGenType id="GenBusinessEbi">

<NeedGenOutType id="File"></NeedGenOutType>

<NeedGenOutType id="My"></NeedGenOutType>

</NeedGenType>

</NeedGenTypes>

<ExtendConfs>

<ExtendConf id="moduleName" isSingle="true">user</ExtendConf>

</ExtendConfs>

</ModuleGenConf>

(1)<ModuleGenConf>:每个模块配置的根节点

(2)<ModuleName>:模块的标识名称,在GenConf的NeedGen里面配置的id就是这个值

(3)<NeedGenTypes>:用来配置需要生成的功能,可以配置多个

(4)<NeedGenType>:配置一个本模块需要生成的功能,属性如下:

? id:需要生成的功能的标识,这个标识在theme的配置中定义

(5)<NeedGenOutType>:配置模块的某个功能生成完成后,输出的类型,一个功能可以有多种输出。属性如下:

? id:具体输出的标识,这个标识在theme的配置中定义

(6)<ExtendsConfs>:本模块需要配置的,自行扩展的数据,可以配置多个数据。

(7)<ExtendConf>:描述一条自行扩展的数据,属性如下:

? id:自定义数据的标识

? isSingle:数据是单个值还是一个数组,true表示是单个值,false表示是数组,如果是数组的话,多个值之间用逗号分开

第三类就是外部主题的配置数据

在制作主题的时候就配置好,里面有这套主题需要的外部数据,和预定义好的功能配置,在每次使用的时候一般不需要配置或修改。比如:缺省为xml配置,取名为ThemeConf.xml。

外部主题目前不支持自定义,也就是采用默认的xml方式,而且文件名称也固定是ThemeConf.xml,其实要实现支持自定义也很简单,只是没有必要,那样会无谓的增加复杂度。示例如下:


<Theme id="simple">

<GenTypes>

<GenType id="GenBusinessEbi" type="cn.javass.themes.simple.actions.GenBusinessEbiAction">

<Params>

<Param id="relativePath">business.ebi</Param>

<Param id="mbPathFile">business/Ebi.txt</Param>

<Param id="preGenFileName"></Param>

<Param id="afterGenFileName">Ebi.java</Param>

</Params>

</GenType>

</GenTypes>

<GenOutTypes>

<GenOutType id="Console" type="cn.javass.xgen.output.types.OutputToConsole"></GenOutType>

<GenOutType id="File" type="cn.javass.xgen.output.types.OutputToFile"></GenOutType>

</GenOutTypes>

<Providers>

<Provider id="XmlModuleGenConf" type="cn.javass.xgen.genconf.implementors.xmlimpl.ModuleGenConfXmlImpl"></Provider>

</Providers>

</Theme>

(1)<Theme>:主题配置的根节点,属性如下:

? id:主题的标识,必须唯一,在GenConf注册theme的id就是这个值

(2)<GenTypes>:主题提供的可输出的功能,可配置多个

(3)<GenType>:描述一个主题可输出的具体功能,属性如下:

? id:功能的标识,必须唯一,在ModuleGenConf里面配置每个模块的NeedGenType的id就是这个值

? type:真正实现输出功能的类

(4)Params:配置每个输出类需要的参数,下面可以配置多个param

(5)param:具体的每个参数的配置,值就是参数的值,属性为:

? id:参数的标识,在一个params必须唯一

(6)GenOutTypes:主题提供的输出类型,可以配置多个

(7)GenOutType:一个具体的输出类型,属性如下:

? id:功能的标识,必须唯一,在ModuleGenConf里面配置每个模块的NeedGenOutType的id就是这个值

? type:真正实现输出类型的类

(8)Providers:主题提供的读取配置文件的类型,可以配置多个

(9)Provider:一个具体的读取配置文件的类型,属性如下:

? id:功能的标识,必须唯一,在GenConf里面配置NeedGen的provider就是这个值

? type:真正实现具体的读取配置文件的类

2.2  对外程序接口设计

为了让外部 获取配置管理模块内的数据,提供相应的API(应用程序接口),也就是GenConfEbi,基本定义如下:


/**

* 对外提供的访问配置数据的API

@author cc

@version 1.0

*/

public interface GenConfEbi {

/**

* 获取核心框架运行需要的配置数据

@return 核心框架的配置数据model

*/

public GenConfModel getGenConf();

/**

* 获取需要生成的模块配置

@return 包含需要生成的模块配置数据的Map:key-模块名称,value-相应模块的配置数据Model

*/

public Map<String, ModuleConfModel> getMapModuleConf();

////下面的这些为实现中需要的一些快速获取配置数据的方法//////

/**

* 根据需要生成的模块配置和theme中的生成类型编号,来获取相应的theme的生成类型的数据Model

@param moduleConf 需要生成的模块配置数据Model

@param genTypeId theme中的生成类型编号

@return 相应的theme的生成类型的数据Model

*/

public GenTypeModel getThemeGenType(ModuleConfModel moduleConf,String genTypeId);

/**

* 根据需要生成的模块配置和theme中的输出类型编号,来获取相应的theme的输出类型的实现类的配置数据

@param moduleConf 需要生成的模块配置数据Model

@param genOutTypeId theme中的输出类型编号

@return 相应的theme的输出类型的实现类的配置数据

*/

public String getThemeGenOutType(ModuleConfModel moduleConf,String genOutTypeId);

/**

* 根据需要生成的模块配置和模块配置中的扩展数据编号来获取相应的扩展数据

@param moduleConf 需要生成的模块配置数据Model

@param extendId 扩展数据编号

@return 相应的扩展数据的值

*/

public ExtendConfModel getModuleExtend(ModuleConfModel moduleConf,String extendId);

}

有些朋友可能会问,你怎么能定义出这些方法来,很简单,因为我已经把系统整体设计过一遍了,可以知道,外部模块对配置管理的接口基本要求如上。

本文由微信公众号——架构设计一起学 推出,

可点击“阅读原文”,了解更多!

原文地址:https://www.cnblogs.com/jiagoushejiyiqixue/p/10236280.html

时间: 2024-10-27 05:04:48

设计模式综和实战项目x-gen系列二的相关文章

RN实战项目网络请求封装(二)

RN实战项目网络请求封装(二) 网络相关学习文档,参考 RN中文网文档 RN中主要是用fetch来完成异步网络请求的,传统的ajax慢慢的会被fetch替代 RN中文网fetch API 案例 fetch('https://mywebsite.com/endpoint/', { method: 'POST', //请求方法 默认get headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', //数据

《Android源码设计模式解析与实战》读书笔记(二十二)

第二十二章.享元模式 享元模式是结构型设计模式之一,是对对象池的一种实现.就像它的名字一样,共享对象,避免重复的创建.我们常用的String 就是使用了共享模式,所以String类型的对象创建后就不可改变,如果当两个String对象所包含的内容相同时,JVM只创建一个String对象对应这两个不同的对象引用. 1.定义 采用一个共享来避免大量拥有相同内容对象的开销.使用享元模式可有效支持大量的细粒度对象. 2.使用场景 (1)系统中存在大量的相似对象. (2)细粒度的对象都具备较接近的外部状态,

《Android源代码设计模式解析与实战》读书笔记(二十二)

第二十二章.享元模式 享元模式是结构型设计模式之中的一个.是对对象池的一种实现.就像它的名字一样,共享对象.避免反复的创建. 我们经常使用的String 就是使用了共享模式.所以String类型的对象创建后就不可改变,假设当两个String对象所包括的内容同样时,JVM仅仅创建一个String对象相应这两个不同的对象引用. 1.定义 採用一个共享来避免大量拥有同样内容对象的开销.使用享元模式可有效支持大量的细粒度对象. 2.使用场景 (1)系统中存在大量的类似对象. (2)细粒度的对象都具备较接

《Android源码设计模式解析与实战》读书笔记(二十一)

第二十一章.装饰模式 装饰模式也称为包装模式,是结构型设计模式之一.装饰模式是一种用于替代继承技术的一种方案. 1.定义 动态的给一个对象添加一些额外的职责.就增加功能来说,装饰模式相比生成子类更为灵活. 2.使用场景 (1)需要透明且动态地扩展类的功能时.且在不影响其他对象的情况下. (2)当不能采用继承对系统进行扩展时可以使用装饰模式.比如final类. 3.UML类图 (1)Component:抽象组件.可以是一个接口或抽象类,其充当的就是被装饰的原始对象. (2)ConcreteComp

《Android源码设计模式解析与实战》读书笔记(二十四)

第二十四章.桥接模式 桥接模式也称为桥梁模式,是结构型设计模式之一.桥接模式中体现了"单一职责原则"."开闭原则"."里氏替换原则"."依赖倒置原则"等.同时它也是很实用的一种模式. 1.定义 将抽象部分与现实部分分离,使它们都可以独立地进行变化. 2.使用场景 (1)如果一个系统需要在构建的抽象化角色和具体角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系. (2)对于那些不希望使用继承或因为多层次继承导致系统类

大家来一起开发HTML5项目如何【系列二】

之前出系列一,大家都没能积极响应,心里有点小失落.再加上年底公司事情比较多,就一直搁着,昨天开始继续研究,算是取得了一些进步, 不过又遇到了新的瓶颈.接下来就跟大家分享下这两天的成果吧. 系列一中确定了思想,主要从以下几个方面着手, 1.用HTML5调用摄像头,进行拍照. 2.将拍照获取的图像数据流传到后台进行解析. 3.返回数据,如果解析不成功继续解析,知道解析成功为止. 第一步已经在我的博客中有了. http://blog.csdn.net/laijieyao/article/details

.NET Core实战项目之CMS 第十七章 CMS网站系统的部署

原文:.NET Core实战项目之CMS 第十七章 CMS网站系统的部署 目前我们的.NET Core实战项目之CMS系列教程基本走到尾声了,通过这一系列的学习你应该能够轻松应对.NET Core的日常开发了!当然这个CMS系统的一些逻辑处理还需要优化,如没有引入日志组件以及缓存功能,权限目前只支持控制到菜单,却没有控制到具体的功能(其实这块只是苦于样式不会处理,不然的话也会把功能加上),不过话又说回来,这些都是次要的,后期有时间慢慢补上吧,因为我开这个系列的初衷也是对大家入门.NET Core

.NET Core实战项目之CMS 第十三章 开发篇-在MVC项目结构介绍及应用第三方UI

作为后端开发的我来说,前端表示真心玩不转,你如果让我微调一个位置的样式的话还行,但是让我写一个很漂亮的后台的话,真心做不到,所以我一般会选择套用一些开源UI模板来进行系统UI的设计.那如何套用呢?今天就以我们系列实战教程中的CMS系统为例来应用第三方的后台模板LayuiCMS2.0为例来进行实战演练吧! 本文已收录至<.NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划> 作者:依乐祝 首发地址 "DotNetCore实战"公众号 原文地址:https://w

安卓入门实战项目-身份证信息查看器,精确解读身份证信息

本系列教程致力于可以快速的进行学习安卓开发,按照项目式的方法,通常一篇文章会做一个小程序.提高学习的兴趣. 一方面总结自己所得,另一方面可以通过自己的分享帮助更多学习的同仁. 因为知识的连贯性,推荐按照瞬息进行学习.目录链接:http://www.chengxiaoxiao.com/bozhu/1336.html 本教程由今日头条-做全栈攻城狮原创首发,转载请注明出处. 大学生求兼职:请联系wx:aiquanzhan 页尾提供github源代码下载地址. 一.项目描述 通过小程序实现精准解读身份