設計模式綜和實戰項目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);
    }

有些朋友可能會問,你怎麼能定義出這些方法來,很簡單,因爲我已經把系統整體設計過一遍了,可以知道,外部模塊對配置管理的接口基本要求如上。

本文由微信公衆號——架構設計一起學推出,
點擊“閱讀原文”,瞭解更多!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章