一背景
在現在的網站中接入的渠道是越來越多了技術也是越來越先進WAP SMSEMAIL 傳統的Web Socket等等如果連數據庫和LDAP也算接入的話那在設計之中需要擴展的空間要做到很好 很好才保證在添加新的渠道情況下不需要更多的修改代碼甚至不改代碼的情況但可能嗎我想也不可能但有什麼方式可以更好的解決這種多渠道接入的框架的完美性呢
二構架
【圖一】
如圖一所顯示在現有的所有接入都已經使用上的時候設計者看的都眼花缭亂了如果是為了湊份子那這些程序怎麼寫都可以而且也肯定可以實現但維護起來就會比較痛苦還是回到那個問題怎麼可以實現更完美呢如圖二顯示
圖二看起來象個八爪的章魚章魚腿分別連接所有的接入渠道進行連接所有這些渠道的核心就是這個章魚的頭XMLRouterRouter在此的作用是溝通所有渠道實現數據的路由爭強系統在構架上的擴展性和靈活性好處會很多很多稱呼為XMLRouter是因為如果不使用XML這種靈活而又規范的語言來做為數據傳輸的媒介那Router的工作量也同樣會成倍的增加定義好XML的規范後將為以後的擴展帶來很多好處
三思想和模式
XMLRouter的最初想法來自於計算機的主板和< >之中的Builder Pattern 計算機主板的PCI 插槽定義了PCI的規范只要你生產的卡符合PCI標准那你插入到這個主板上就可以工作 至於裡面是怎麼工作的則是已經封裝好了 Builder Pattern則是提出將復雜的構建分離開來 一步一步的進行實現XMLRouter是將這些復雜的渠道分離開來一個個的進行表現
Services思想:為了能和Router進行溝通在這些渠道接入時必須定義統一的接口這裡成為Services 只要符合Services規范的程序就可以接入到Router並進行數據的路由
Factory模式和Composite模式
XMLRouter在實際的設計中將采用Factory模式產生Router由RouterFactory生產 在投入使用時將放置於隊列中傳遞數據和接收數據以及返回數據都從隊列中取相應的Router來調用應用了Composite的模式
四XML配置文件
XML文件對於Router之中的使用分為兩個部分 第一個是Router的配置如:
以下是引用片段
< xmlversion=>
< services>
< !databaseService>
< servicename=databasetype=databaseclass=comwebserviceDBService>
< connector
driver=commicrosoftjdbcsqlserverSQLServerDriver
url=jdbc:microsoft:sqlserver://:user=test
passwd=test/>
< /service>
< !WebService>
< servicename=webtype=webclass=comwebserviceWebService>
< connector />
< /service>
……
< /services>
這是Router的配置文件 service節點代表需要接入的渠道 service節點包含connector子節點 子節點的配置根據type來區分 如果是database則包含url user passwddriver等屬性 如果是socket則包含
port maxthread等屬性 屬性值可以根據自己的定義來配置
另一種XML文件則是XML交易數據文件用於在所有的services中傳遞數據每個Services自己包涵一個相應的XML文件比如webtransxml格式如下:
以下是引用片段
< xmlversion=>
< transaction>
< transname=addDocservice=databasemethod=insert>
< propertyname=createtimetype=timestamp/>
< propertyname=creatoridtype=long/>
< propertyname=doctypeidtype=int/>
< propertyname=docstatusidtype=int/>
< /trans>
< /transaction>
相應的dbtransxml格式如下
以下是引用片段
< transname=addDoctable=TDOC_DOCSmethod=insert>
< primarykeyname=docid/>
< set>
< propertyname=createtimetype=timestamp/>
< propertyname=creatoridtype=long/>
< propertyname=doctypeidtype=int/>
< propertyname=docstatusidtype=int/>
< /set>
< /trans>
其余XML則可按這樣的規則來定制
五技術實現
RouterFactory
以下是引用片段
packagecomwebrouter;
importcomwebplatformExceptionRouterException;
importjavautiljava/util/ltarget=_blank>Hashtable;
以下是引用片段
/**
*Router產生和清除的類
*/
publicclassRouterFactory
{
/**
*Router存儲的樹front
*/
privatestaticjava/util/ltarget=_blank>HashtableQueuePairFront=null;
/**
*Router存儲的樹back
*/
privatestaticjava/util/ltarget=_blank>HashtableQueuePairBack=null;
From:http://tw.wingwit.com/Article/program/net/201311/13742.html