設計模式綜和實戰專案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); } |
有些朋友可能會問,你怎麼能定義出這些方法來,很簡單,因為我已經把系統整體設計過一遍了,可以知道,外部模組對配置管理的介面基本要求如上。
本文由微信公眾號——架構設計一起學 推出,
可點選“閱讀原文”,瞭解更多!