1. 程式人生 > >配置管理1——設計模式綜合專案實戰 x-gen程式碼生成器

配置管理1——設計模式綜合專案實戰 x-gen程式碼生成器

n獲取使用者配置的資料

  配置的方式很多,要求除了框架自身提供的配置方式外,還要能支援使用者自定義的配置方式。比如:框架本身提供預設的配置方式為xml配置,如果使用者想使用資料庫來配置,那麼框架必須能夠支援使用者自定義一種資料庫配置的方式 ,並能夠很容易的加入到系統中進行使用。

n快取使用者配置的資料

  同一份配置資料,在執行期間會多次使用,但是獲取使用者配置資料的動作就只需要一次就可以了,獲取過後,就快取下來,重複使用了。

n對外提供介面

  讓其他模組通過這些介面來獲取他們需要的資料

配置管理模組的功能邊界

n配置管理模組的功能邊界

1:配置管理模組不關心被訪問的資料是怎麼來的,它只是按照訪問方式去獲取這些資料,當然不同的資料格式有不同的訪問方式。

2:雖然需要支援自定義配置方式,但是需要配置的資料是一定的,只是配置的格式不同,訪問這些配置資料的方式不同,但最後殊途同歸,都想配置管理模組提供相應的資料。因此這個需要配置的資料項是要統一起來的。

3:配置管理模組不關心獲取到的資料是什麼,也不關心這些資料的含義,更不關心這些資料怎麼用,它只是負責獲取這些資料並儲存起來。

4:配置管理模組不關心誰來使用這些資料,也不關心外部獲取這些資料後如何使用,它只是負責提供這些資料而已。

配置管理模組的對外介面

n對外資料介面設計

  目前設計的配置分成三類,雖然配置的方式不固定,但是對於核心框架而言,有一些資料是必需要配置的,所以還是需要設計對外的資料介面。

  為了簡單,這裡以xml為例子來說明定義的資料結構。但是請注意,x-gen框架並不侷限於使用xml作為配置的方式,同樣你可以選用properties檔案、資料庫等其他的配置方式。

  雖然配置方式不同,需要配置的資料卻是一樣的,所以,你可以把這裡xml描述的配置資料改成任何你希望使用的配置方式相對應的資料結構。

n第一類是核心框架執行需要的資料

  以xml配置為例,預設取名為GenConf.xml,在每次使用的時候根據需要修改或配置其內容。當然,為了示例簡單,就不去做dtd或者schema了。 

java程式碼:
  1. <?xml version="1.0" encoding="UTF-8"
    ?>  
  2. <GenConf>  
  3.     <NeedGens>  
  4.         <NeedGen id="UserGenConf" provider="XmlModuleGenConf" themeId="simple">  
  5.             <Params>  
  6.                 <Param id="fileName">UserGenConf.xml</Param>  
  7.             </Params>   
  8.         </NeedGen>  
  9.     </NeedGens>  
  10.     <Themes>  
  11.         <Theme id="simple">cn/javass/themes/simple</Theme>  
  12.     </Themes>  
  13.   <Constants>  
  14.         <Constant id="prePackage" value="cn.javass"></Constant>  
  15.         <Constant id="projectName" value="framework"></Constant>  
  16.     </Constants>  
  17. </GenConf>  
n節點說明如下:

(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 :常量的標識名稱或編號,必須唯一

n第二類是使用者需要生成的模組的配置資料

  比如:使用者想要生成一個模組內的增刪改查的原始碼,裡面有每個具體功能的配置,而每個具體功能就是一個原始碼檔案。

  這個也需要在每次使用的時候根據需要來配置,並註冊到核心框架執行配置裡面去,每次生成主要配置的就是這類資料。示例如下:

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

<ModuleGenConf id=“UserConf”>

  <NeedGenTypes>

  <NeedGenType id="GenBusinessEbi">

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

  </NeedGenType>

  </NeedGenTypes>

  <ExtendConfs>

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

  </ExtendConfs>

</ModuleGenConf> 

n節點說明如下:

(1)<ModuleGenConf>:每個模組配置的根節點,屬性如下:

  id:模組的標識,不重複即可

(2)<NeedGenTypes>:用來配置需要生成的功能,可以配置多個

(3)<NeedGenType>:配置一個本模組需要生成的功能,屬性如下:

  id:需要生成的功能的標識,這個標識在theme的配置中定義

(4)<NeedGenOutType>:配置模組的某個功能生成完成後,輸出的型別,一個功能可以有多種輸出。屬性如下:

  id:具體輸出的標識,這個標識在theme的配置中定義

(5)<ExtendsConfs>:本模組需要配置的,自行擴充套件的資料,可以配置多個數據。

(6)<ExtendConf>:描述一條自行擴充套件的資料,屬性如下:

  id:自定義資料的標識

  isSingle:資料是單個值還是一個數組,true表示是單個值,false表示是陣列,如果是陣列的話,多個值之間用逗號分開

n第三類就是外部主題的配置資料

  在製作主題的時候就配置好,裡面有這套主題需要的外部資料,和預定義好的功能配置,在每次使用的時候一般不需要配置或修改。比如:預設為xml配置,取名為ThemeConf.xml。

  外部主題目前不支援自定義,也就是採用預設的xml方式,而且檔名稱也固定是ThemeConf.xml,其實要實現支援自定義也很簡單,只是沒有必要,那樣會無謂的增加複雜度。

  示例如下:

java程式碼:
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <Theme id="simple">  
  3.   <GenTypes>  
  4.     <GenType id="GenBusinessEbi" type="cn.javass.themes.simple.actions.GenBusinessEbiAction">  
  5.       <Params>  
  6.         <Param id="relativePath">business.ebi</Param>  
  7.         <Param id="mbPathFile">business/Ebi.txt</Param>  
  8.         <Param id="preGenFileName"></Param>  
  9.         <Param id="afterGenFileName">Ebi.java</Param>  
  10.       </Params>  
  11.     </GenType>  
  12.   </GenTypes>  
  13.   <GenOutTypes>  
  14.     <GenOutType id="Console" type="cn.javass.xgen.output.types.OutputToConsole"></GenOutType>  
  15.     <GenOutType id="File" type="cn.javass.xgen.output.types.OutputToFile"></GenOutType>  
  16.   </GenOutTypes>  
  17.   <Providers>  
  18.     <Provider id="XmlModuleGenConf" type="cn.javass.xgen.genconf.implementors.xmlimpl.ModuleGenConfXmlImpl"></Provider>  
  19.   </Providers>    
  20. </Theme>  

1<Theme>:主題配置的根節點,屬性如下:

id:主題的標識,必須唯一,在GenConf註冊themeid就是這個值

2<GenTypes>:主題提供的可輸出的功能,可配置多個

3<GenType>:描述一個主題可輸出的具體功能,屬性如下:

id:功能的標識,必須唯一,在ModuleGenConf裡面配置每個模組的NeedGenTypeid就是這個值

type:真正實現輸出功能的類

4Params:配置每個輸出類需要的引數,下面可以配置多個param

5param:具體的每個引數的配置,值就是引數的值,屬性為:

id:引數的標識,在一個params必須唯一

6GenOutTypes:主題提供的輸出型別,可以配置多個

7GenOutType:一個具體的輸出型別,屬性如下:

id:功能的標識,必須唯一,在ModuleGenConf裡面配置每個模組的NeedGenOutTypeid就是這個值

type:真正實現輸出型別的類

6Providers:主題提供的讀取配置檔案的型別,可以配置多個

9Provider:一個具體的讀取配置檔案的型別,屬性如下:

id:功能的標識,必須唯一,在GenConf裡面配置NeedGenprovider就是這個值

type:真正實現具體的讀取配置檔案的類

n對外程式介面設計

  為了讓外部獲取配置管理模組內的資料,提供相應的API(應用程式介面),也就是GenConfEbi

配置管理模組的內部實現

n實現的起點

  為了讓大家更好的理解配置管理模組的內部實現架構,因此先以一個最簡單的實現結構為起點,採用重構的方式,逐步把相關的設計模式應用進來,從簡單到複雜,從而讓大家更好的看到如何選擇要使用的設計模式、如何實際應用設計模式以及如何讓多種設計模式協同工作。

  1:先就來看看實現配置管理的起點,首先根據對外提供的資料結構定義,製作出相應的資料model來。

  2:針對前面定義的API,提供一個最基本的實現,只需要滿足最基本的功能就可以了,需要實現讀取配置檔案的功能,然後要有快取配置資料的功能,最後就是實現API中要求的功能。

n此時配置管理模組的結構示意如圖

加入簡單工廠

n面臨的問題 

  觀察上面的實現,向模組外部提供了介面,可是外部根本不知道模組內部的具體實現,那麼模組外部如何來獲取一個實現介面的實現物件呢?

n用簡單工廠來解決

  簡單工廠是解決上述問題的一個合理方案。那麼先一起來回顧一下簡單工廠的一些基礎知識,然後再來看如何應用它來解決上面的問題。

n簡單工廠基礎回顧  初識簡單工廠 n定義

  提供一個建立物件例項的功能,而無須關心其具體實現。被建立例項的型別可以是介面、抽象類,也可以是具體的類。

n結構和說明

  Api:定義客戶所需要的功能介面

  Impl:具體實現Api的實現類,可能會有多個

  Factory:工廠,選擇合適的實現類來建立Api介面物件

  Client:客戶端,通過Factory去獲取Api介面物件,然後面向Api介面程式設計  


簡單工廠的知識要點

n簡單工廠的知識要點  

1:簡單工廠位於對外提供介面的模組內

2:簡單工作的主要功能就是用來建立物件例項,被建立的物件可以是介面、抽象類或是普通的類

3:簡單工廠可以實現成為單例,也可以實現成靜態工廠

4:簡單工廠的內部實現,主要是做“選擇合適的實現”,實現是已經做好的,簡單工廠只是來選擇使用即可

5:簡單工廠在進行選擇的時候,需要的引數可以從客戶端傳入、配置檔案、或者是執行期程式某個執行結果等

6:如果使用反射+配置檔案的方式,可以寫出通用的簡單工廠

思考簡單工廠

n簡單工廠的本質  

  簡單工廠的本質是:選擇實現

n何時選用簡單工廠  

1:如果想要完全封裝隔離具體實現,讓外部只能通過介面來操作封裝體,那麼可以選用簡單工廠,讓客戶端通過工廠來獲取相應的介面,而無需關心具體實現

2:如果想要把對外建立物件的職責集中管理和控制,可以選用簡單工廠,一個簡單工廠可以建立很多的、不相關的物件,可以把對外建立物件的職責集中到一個簡單工廠來,從而實現集中管理和控制

應用簡單工廠

n 使用簡單工廠來解決問題的思路  

  簡單工廠解決這個問題的思路就是,在配置管理模組裡面新增一個類,在這個類裡面實現一個方法,讓這個方法來建立一個介面物件並返回然後把這個類提供給客戶端,讓客戶端通過呼叫這個類的方法來獲取介面物件。

n此時配置管理模組的結構示意如圖  加入單例模式 n面臨的問題 

  看看上面的基本實現,會發現一些問題:

1:如果GenConfEbo被建立多次的話,那麼就會重複獲取配置資料,浪費程式執行時間;

2:並且每個GenConfEbo的例項都會快取這些資料,浪費記憶體空間。

3:同一個類裡面,既有實現GenConfEbi要求的對外功能,又有內部實現需要的獲取配置資料和快取資料的功能,從類的設計上來說,這個類的職責太不單一了,應該分離一部分職責出去。

  因此這種實現肯定是不好的,那麼怎麼解決呢?

n用單例模式來解決 n單例模式基礎回顧 

初識單例模式

n定義

  保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點。

n結構和說明

Singleton:

  負責建立Singleton類自己的唯一例項,並提供一個getInstance的方法,讓外部來訪問這個類的唯一例項。

單例模式的知識要點

n單例模式的知識要點  

1:單例模式是用來保證一個類在執行期間只會被建立一個類例項的

2:單例模式還提供了一個全域性唯一訪問這個類例項的訪問點,通常就是那個getInstance方法

3:單例模式只關心類例項的建立問題,並不關心具體的業務功能。

4:單例模式是一個虛擬機器範圍內單例,不適用於叢集等環境

5:單例模式的實現有很多種,除了常見的懶漢式和餓漢式外,還有利用快取來實現、雙重檢查加鎖的實現、Lazy initialization holder class模式、以及列舉的實現方式等

6:使用單例模式的時候要注意它的執行緒安全性

7:單例模式體現了延遲載入、快取等常見的設計思想

8:單例模式是可以很容易的擴充套件到多例項控制的

思考單例模式

n單例模式的本質  

  單例模式的本質是:控制例項數目

n n何時選用單例模式 

  當需要控制一個類的例項只能有一個,而且客戶只能從一個全域性訪問點訪問它時,可以選用單例模式,這些功能恰好是單例模式要解決的問題

應用單例模式

n此時配置管理模組的結構示意如圖 

相關推薦

配置管理1——設計模式綜合專案實戰 x-gen程式碼生成器

n獲取使用者配置的資料   配置的方式很多,要求除了框架自身提供的配置方式外,還要能支援使用者自定義的配置方式。比如:框架本身提供預設的配置方式為xml配置,如果使用者想使用資料庫來配置,那麼框架必須能夠支援使用者自定義一種資料庫配置的方式 ,並能夠很容易的加入到系統中進行使用。 n快取使用者配置的資料

java設計模式綜合專案實戰

本課程精心設計了一個實際應用X-gen,把GoF的設計模式細緻、貼切的組合起來,構建一個精緻的架構,開放、靈活而又非常小巧。  X-gen簡介:x-gen是一個能按照模板和配置去生成結果的通用框架(比如:根據配置去生成業務模組的CRUD,包括頁面等),設計精巧,結構靈活,平

JAVA版23種設計模式綜合專案實戰),設計模式綜合應用的

加入組合模式 n面臨的問題   分析前面直譯器模式的實現,會發現對於客戶端而言,並不想要去區分到底是非終結符物件還是終結符物件,只是想要以一個統一的方式來請求解析。   該怎麼解決這個問題呢? n n用組合模式來解決   n組合模式基礎回顧  初識組合模式 n定義 &n

設計模式綜合實戰專案x-gen 系列三

1 模組內部實現 1.1 實現起點 為了讓大家更好的理解配置管理模組的內部實現架構,因此先以一個最簡單的實現結構為起點,採用重構的方式,逐步把相關的設計模式應用進來,從簡單到複雜,從而讓大家更好的看到如何選擇要使用的設計模式、如何實際應用設計模式以及如何讓多種設計模式協同工作。 1.1.1 先就來看看實

設計模式綜和實戰專案x-gen系列二

  1  詳細功能  1.1  詳細功能 配置管理模組的主要功能是: 1:獲取使用者配置的資料,配置的方式很多,要求除了框架自身提供的配置方式外,還要能支援使用者自定義的配置方式。比如:框架本身提供預設的配置方式為xml配置,如果使用者想使用資料庫來配置,那麼框

設計模式綜合實戰項目x-gen 系列三

vid 設計模式 實例 傳遞 lee 工廠 靜態工廠 例如 ring 1 模塊內部實現 1.1 實現起點 為了讓大家更好的理解配置管理模塊的內部實現架構,因此先以一個最簡單的實現結構為起點,采用重構的方式,逐步把相關的設計模式應用進來,從簡單到復雜,從而讓大家更好的看到

《Android源代碼設計模式解析與實戰》讀書筆記(八)

code androi nal clas 函數 轉發 類和對象 cti comment 第八章、狀態模式 1.定義 狀態模式中的行為是由狀態來決定,不同的狀態下有不同的行為。當一個對象的內在狀態改變時同意改變其行為,這個對象看起來像是改變了其類。

《Android源代碼設計模式解析與實戰》讀書筆記(二十)

apt 通過 rip idv ber list adaptee 無法 技術分享 第二十章、適配器模式 適配器模式是結構型設計模式之中的一個,它在我們的開發中使用率極高,比方ListView、GridView以及RecyclerView都須要使用A

《Android源代碼設計模式解析與實戰》讀書筆記(十)

.net main 簡單的 給定 ron charat 新增 ack parse 第十章、解釋器模式 解釋器模式是一種用的比較少的行為型模式。其提供了一種解釋語言的語法或表達式的方式。可是它的使用場景確實非常廣泛,僅僅是由於我們自己非常少回去構造

1.設計模式入門

prot 針對 面向 comm 理解 給定 發生 中介 這也 1. 設計模式定義 設計模式是一套被反復使用的、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。毫無疑問,設計模式於己於他人於系統都是多贏的,

2018最新技術Java架構師高並發高性能高可用分布式集群電商緩存性能調優設計模式項目實戰視頻教程

tcp ice cti HA 統架構 朋友 ear ppc iat 36套精品Java精品高級課,架構課,java8新特性,P2P金融項目,程序設計,功能設計,數據庫設計,第三方支付,web安全,高並發,高性能,高可用,分布式,集群,電商,緩存,性能調優,設計模式,項目實戰

2.1 設計模式之單例模式

單例模式 餓漢式與懶漢式程式碼 class singleTon { private: singleTon() {} ~singleTon() {} public: static singleTon* getInstance() { if(NULL == instance_

1.設計模式-----簡單工廠模式

簡單工廠模式 定義:(定義一個用於建立物件的介面,讓子類決定例項化哪一個類。工廠方法使一個類的例項化延遲到其子類。) 簡單來說:就是在工廠裡面例項化物件,隱藏了物件的實現。 以一個計算器的程式碼為案例: //抽象運算類 public abstract class Operatio

C++ 設計模式原理與實戰大全-架構師需備課程-夏曹俊-專題視訊課程

C++ 設計模式原理與實戰大全-架構師需備課程—716人已學習 課程介紹         C++屬於難學易用的工程開發語言,C++繁複的語法往往使得開發人員過於強調細節而缺乏軟體體系結構的大局觀。特

設計模式學習筆記(1)-----設計模式6大原則

單一職責原則 Single Responsibility Principle(SRP) 每一個介面就承擔一個責任(或者說是一類的責任),儘量做到只有一個原因引起變化 ps:電話機通話的過程可以分為 ,撥打電話->通話->結束通話電話 這裡撥打 和 結束通話 都是物理層面

設計模式綜合例項分析之資料庫同步系統(一)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

生成樹協議配置管理——1

生成樹協議——STP——Spanning Tree Protocol,主要以理解其原理和演算法為主。 生成樹協議就是用來消除網路中可能存在的二層環路,以防止廣播風暴,或者資料傳輸死迴圈。有STP(生成樹協議)、RSTP(快速生成樹協議)和MSTP(多生成樹協議)    

設計模式專案架構中的最佳實踐 -- 生成器模式介面卡模式

設計模式在專案架構中的最佳實踐 – 生成器模式/介面卡模式 ​ 一年多來,做了幾個專案,雖然沒有什麼技術和業務難度,但是也不能白白浪費了自己一年的光景,除了技術也業務外,總有一些知識值得我們去總結和學習; ​ 這麼些年埋頭於苦幹,很少抽出時間來整理提高自己的綜合

JavaSE基礎(day23)(1)設計模式

默寫: 1.建立 Class物件的四種方式 2.通過Class 物件 如何建立對應的java型別的例項? newInstance() 最終呼叫構造方法 3.如何通過Class 物件獲取建構函式型別的物件 如何獲得欄位型別的物件 如何獲取方法型別的物件 getConstructor get

前端讀者 | Javascript設計模式理論與實戰:狀態模式

本文來自 @狼狼的藍胖子;連結:http://luopq.com/2015/11/25/design-pattern-state/ 在軟體開發中,很大部分時候就是操作資料,而不同資料下展示的結果我們將其抽象出來稱為狀態,我們平時開發時本質上就是對應用程式的各種狀態進行切換並作出相應處理。狀態模式就