專利名稱:實現計算機軟件系統中的構件動態聚合的方法
技術領域:
本發明涉及計算機軟件技術領域,特別涉及計算機構件化軟件系統領域,具體是指一種實現計算機軟件系統中的構件動態聚合地方法。
背景技術:
隨著現代構件化計算機軟件技術的進一步發展,CAR(Component Assembly Runtime)構件技術是一種面向構件編程(Component Oriented Programming,簡稱COP)技術,它定義了一套網絡編程時代的構件編程模型和編程規范,規定了一組構件間相互調用的標準,使得二進制構件能夠自描述,能夠在運行時動態鏈接。
目前,CAR構件技術已在某些先進的嵌入式操作系統上實現,在該嵌入式操作系統的SDK(Software Development Kit)下,用戶很容易編寫出自己的構件。
CAR構件技術的基礎思想來源于微軟的COM,但它對微軟的COM進行了拓展,并且二者不兼容。CAR構件技術由CAR語言(構件描述語言,描述構件的元數據信息)、CAR編譯器、自動代碼生成工具以及CAR構件基礎庫支持。CAR構件技術體現了網絡編程時代的特性,編程界面簡單。
在COM里,聚合是一種構件的復用技術,請參閱圖1所示,當構件對象B聚合了構件對象A,那么對于客戶端來說,并不知道有構件對象A的存在,客戶端使用構件對象A的服務完全由構件對象B來傳替,被聚合對象A的生存周期也完全由對象B控制。(對于被聚合的對象我們有時也稱之為內部對象,聚合者則相應稱為外部對象)。
然而COM里的聚合模型有著比較大的限制,那就是一旦外部對象聚合了內部對象,那么內部對象其行為和生存周期完全由外部對象控制了,在外部對象的生存周期內,內部對象和外部對象再也不能拆卸,另外,COM的聚合方式只能在對象創建時發生,不能隨時隨地的聚合。在現實世界里,一個構件對象往往會隨著環境改變而表現出(或擁有)不同的特征。比如寵物店的貓(構件對象),具有寵物和商品兩方面的特征(aspect)。但貓剛生下來時卻未必是寵物,更不會是商品;而一旦被售出,就不再是商品,但寵物特征卻保留了下來。顯而易見,讓貓進入寵物店就擁有寵物和商品兩方面特征,而離開寵物店后就丟棄商品特征,使用COM的聚合模型是實現不了這種現實模型的,因為COM的聚合模型不是一種隨時聚合、隨時拆卸的動態聚合模型,這樣就制約了現代計算機軟件技術的進一步發展。
發明內容
本發明的目的是克服了上述現有技術中的缺點,提供一種能夠根據軟件運行的實際需要動態聚合和動態拆卸、構件對象在不同的運行環境里能夠擁有和去除與運行環境相關的特征、提高構件復用的靈活性,降低程序設計的復雜度、能夠更好地反映描述現實世界模型的實現計算機軟件系統中的構件動態聚合的方法。
為了實現上述的目的,本發明的實現計算機軟件系統中的構件動態聚合的方法如下
該實現計算機軟件系統中的構件動態聚合的方法,其主要特點是,所述的方法包括構件動態聚合操作和構件動態拆卸聚合操作,該構件動態聚合操作包括以下步驟
(1)系統進行初始化操作;
(2)系統實例化方面構件類模型得到被聚合對象實例;
(3)系統實例化外部構件得到外部對象實例;
(4)如果該外部對象實例中不存在被聚合對象實例,則系統將被聚合對象實例的指針傳遞給外部對象實例,外部對象實例保存該指針;否則,系統將被聚合對象實例的指針傳遞給上一層被聚合對象實例,上一層被聚合對象實例保存該指針;
(5)系統將外部對象實例的指針或者上層被聚合對象實例的指針傳遞給該被聚合對象實例;
(6)被聚合對象實例保存相應的指針,形成聚合鏈表,并將該被聚合對象實例在系統中所有的引用計數全部加載到外部對象實例;
(7)完成動態聚合操作;
該構件動態拆卸聚合操作包括以下步驟
(1)系統將需要拆卸的被聚合對象實例的對象標識傳遞給所述的外部對象實例;
(2)該外部對象實例根據該對象標識在聚合鏈表中找出相應的被聚合對象實例的指針;
(3)該被聚合對象實例在聚合鏈表中進行摘除自身并維持剩余的聚合鏈表的處理;
(4)被聚合對象實例從外部對象實例中還原其在系統中所有的引用計數;
(5)完成動態拆卸聚合操作。
所述的構件動態聚合操作中在步驟(4)之前還包括有以下步驟
(31)系統進行構件添加到聚合鏈表前的制約處理。
所述的構件動態聚合操作中在步驟(7)之前還包括有以下步驟
(61)系統進行構件添加到聚合鏈表后的制約處理。
所述的構件動態聚合操作中在步驟(7)之后還包括有以下步驟
(71)系統進行構件聚合完成后的制約處理。
所述的構件動態拆卸聚合操作中在步驟(3)之后還包括有以下步驟
(31)系統進行構件從聚合鏈表摘除后的制約處理。
所述的構件動態拆卸聚合操作中在步驟(5)之后還包括有以下步驟
(51)系統進行構件拆卸聚合完成后的制約處理。
所述的方面構件類模型中具有方面接口,該方面接口中包括有接口查詢成員方法QueryInterface、添加引用成員方法AddRef、釋放成員方法Release和聚合成員方法Aggregate。
所述的被聚合對象實例摘除自身并維持剩余的聚合鏈表的處理包括以下步驟
(1)該被聚合對象實例將自身保存的下一層被聚合對象實例的指針傳遞給上一層被聚合對象實例;
(2)上一層被聚合對象實例保存該指針;
(3)該被聚合對象實例將自身保存的外部對象實例的指針或者上層被聚合對象實例的指針傳遞給下一層被聚合對象實例;
(4)下一層被聚合對象實例保存該指針。
采用了該發明的實現計算機軟件系統中的構件動態聚合的方法,由于通過方面構件模型的對象實例與外部構件的對象實例進行交互操作,最終形成了外部構件對象實例內的聚合鏈表結構,不僅實現了動態聚合、動態拆卸的聚合模型,而且突破了COM只能在創建時聚合以及聚合之后不能拆卸的限制,可提高構件的復用度以及構件復用的靈活性;不僅如此,本發明的方法能夠提高構件接口的查詢和執行效率,增強系統運行的性能和穩定性,在構件的復用領域為面向構件編程提供了寬廣的空間,為軟件工廠化提供了一條簡便的途徑;并且提高了軟件的可擴展性,方便了用戶對不同需求的擴展,為構件化軟件系統的進一步發展奠定了堅實的基礎。
圖1為現有技術中COM組件對象聚合模型示意圖。
圖2為本發明的方面構件對象模型示意圖。
圖3為本發明的方面對象實例在非聚合的情況下接口示意圖。
圖4為本發明的方面對象實例在聚合的情況下接口示意圖。
圖5為本發明的方面對象實例在聚合的情況下從客戶端角度看聚合的結果的示意圖。
圖6為本發明的兩個對象聚合后的簡單狀態示意圖。
圖7為本發明的多個方面對象實例形成聚合鏈表的聚合模型示意圖。
圖8為本發明的方面對象實例進行動態拆卸聚合的示意圖。
具體實施例方式
為了能夠更清楚地理解本發明的技術內容,特舉以下實施例詳細說明。
該實現計算機軟件系統中的構件動態聚合的方法,其中,所述的方法包括構件動態聚合操作和構件動態拆卸聚合操作,該構件動態聚合操作包括以下步驟
(1)系統進行初始化操作;
(2)系統實例化方面構件類模型得到被聚合對象實例;所述的方面構件類模型中具有方面接口,該方面接口中包括有接口查詢成員方法QueryInterface、添加引用成員方法AddRef、釋放成員方法Release和聚合成員方法Aggregate;
(3)系統實例化外部構件得到外部對象實例;還可以包括有以下步驟
(31)系統進行構件添加到聚合鏈表前的制約處理。
(4)如果該外部對象實例中不存在被聚合對象實例,則系統將被聚合對象實例的指針傳遞給外部對象實例,外部對象實例保存該指針;否則,系統將被聚合對象實例的指針傳遞給上一層被聚合對象實例,上一層被聚合對象實例保存該指針;
(5)系統將外部對象實例的指針或者上層被聚合對象實例的指針傳遞給該被聚合對象實例;
(6)被聚合對象實例保存相應的指針,形成聚合鏈表,并將該被聚合對象實例在系統中所有的引用計數全部加載到外部對象實例;還可以包括有以下步驟
(61)系統進行構件添加到聚合鏈表后的制約處理。
(7)完成動態聚合操作;還可以包括有以下步驟
(71)系統進行構件聚合完成后的制約處理。
該構件動態拆卸聚合操作包括以下步驟
(1)系統將需要拆卸的被聚合對象實例的對象標識傳遞給所述的外部對象實例;
(2)該外部對象實例根據該對象標識在聚合鏈表中找出相應的被聚合對象實例的指針;
(3)該被聚合對象實例在聚合鏈表中進行摘除自身并維持剩余的聚合鏈表的處理,該處理包括以下步驟
(a)該被聚合對象實例將自身保存的下一層被聚合對象實例的指針傳遞給上一層被聚合對象實例;
(b)上一層被聚合對象實例保存該指針;
(c)該被聚合對象實例將自身保存的外部對象實例的指針或者上層被聚合對象實例的指針傳遞給下一層被聚合對象實例;
(d)下一層被聚合對象實例保存該指針;
還可以包括有以下步驟
(31)系統進行構件從聚合鏈表摘除后的制約處理。
(4)被聚合對象實例從外部對象實例中還原其在系統中所有的引用計數;
(5)完成動態拆卸聚合操作,還可以包括有以下步驟
(51)系統進行構件拆卸聚合完成后的制約處理。
在實際使用當中,要實現動態的聚合模型,首先要實現類似于COM的聚合模型,也就是說外部對象要聚合內部對象,內部對象必須是可被聚合的。為此在CAR構件技術引入了方面(aspect)構件對象模型,請參閱圖2所示。
aspect是一種特殊的構件類實現,aspect對象的特征是可以被其它構件對象聚合,該構件類必須實現IAspect接口,aspect對象就是實現了IAspect接口的構件對象。
在此附帶說明一下,在COM里所有接口都是繼承IUnknown接口的,在CAR構件體系里,所有接口都是繼承于基接口IObject。IObject接口擴展了IUnknown接口,其定義如下
interface IObject{ECODE QueryInterface([in]REFIID riid,[out]IObject**ppObject);ULONG AddRef(); ULONG Release(); ECODE Aggregate( [in]AggregateType type, [in]IObject*pObject); }
其中的ECODE是個32位整形的返回值,類似于微軟公司的HRESULT。
前三個接口和IUnkown接口基本等價(除了QueryInterface方法的輸出參數為IObject**),但多了個Aggregate方法,這就與COM不兼容了。
通常情況下,在COM里,可被聚合對象必須實現兩個IUnknown接口,委托IUnknown接口和非委托IUnknown接口。在聚合的情況下,委托IUnknown接口把調用傳給外部對象,在非聚合的情況下委托IUnknown接口把調用傳給非委托IUnknown接口;非委托IUnknown接口是對IUnknown接口的真正實現。
對于每個aspect構件對象,對IAspect實現是真正意義上的IObject實現,而對IObject接口實現只是進行簡單的轉接。請參閱圖3所示,當aspect構件對象作為一個獨立的構件對象存在時,對IObject的方法調用將會完全轉接到IAspect接口的對應方法上。再請參閱圖4所示,如果aspect對象被其它構件對象聚合,對IObject的方法調用則會被委托給外部對象的IObject接口方法,外部對象保存aspect對象的IAspect接口指針,用于aspect對象實現的接口查找(QueryInterface),這與COM聚合模型的實現非常類似。
請參閱圖5所示,一旦aspect對象被外部對象聚合了,那么二者就形成了一個構件對象,而在客戶端看來,只知有外部對象的存在,而不知有aspect對象的存在。
在本發明的方法里的aspect對象也具有普通構件對象所具有的功能,也就是說aspect對象不但可被其他普通構件對象聚合,還可以聚合其他的aspect對象。
在本發明的方法里定義一個aspect對象是非常簡單的事情,只要如下描述就可以了
interface IHello
{
Hello();
}
aspect CHello{
interface IHello;
}
那么CHello構件類就是一個可被聚合的aspect構件類了,被實例化后就是aspect對象。
到此,系統中已經建立了兩個普通構件的聚合模型,下面要解決的問題就是怎樣達到隨時聚合(也就是動態聚合),并且能夠隨時拆卸聚合(也就是動態拆卸聚合)。首先是進行動態聚合。
動態聚合就是構件對象隨著執行環境(或者說上下文)的變化,在執行時聚合其他的構件對象。COM里的聚合行為只是發生在組件對象創建之時,如對象B聚合對象A,在創建對象A時,將對象B的IUnknown指針作為CoCreateInstance的第二個參數IA*ia=NULL;HRESULT hr=CoCreateInstance(CLSID_CA,pb,CTX_SAME_DOMAIN,IID_IA,
(PVOID)&ia);……………
上面只是一段示例代碼,IA代表對象A實現的接口,IID為IID_IA,CLSID_CA是對象A的CLSID,pb是聚合者對象B的IUnknown接口指針。
在本發明的方法里,聚合行為的發生是對IObject接口中Aggregate方法的調用。只要兩個對象都被創建出來了,并且滿足了聚合條件,那么聚合行為就可以隨時發生。再看上面的例子,如果我們用m_pOuter表示聚合者對象B的指針(可以是對象B的任意一接口指針),m_pAspect指向被聚合者A的指針(可以是對象A的任意一接口指針),那么下面對Aggregate方法的調用就完成了聚合
m_pAspect->Aggregate(AggrType_Aggregate,m_pOuter);
AggregateType類型指定了AggrType_Aggregate,說明函數完成的是聚合行為。
為了語義上更加明了以及使用上更加簡便,本發明的方法中的構件基礎庫還提供了一個專門用于聚合的API函數
EZAPI EzAggregate(
/*[in]*/POBJECT pAggregator,
/*[in]*/POBJECT pAspect)
其中EZAPI為API函數調用宏,其定義如下
#define EZAPI extern“c”unsigned int_stdcall
這個函數實際上是對上面調用的封裝。pAggregator是指向聚合者的指針,pAspect則指向aspect對象指針。
無論是上面哪種形式被調用,都會發生如下聚合過程
1)外部對象有了指向aspect對象的指針(m_pAspect);
2)被聚合的aspect對象就有了指向外部對象的指針(m_pOuter);
3)aspect對象保存外部對象指針并將所有的引用計數全部轉嫁到外部對象。
聚合后兩個對象的狀態請參閱圖6所示。
上述的過程只是兩個對象的聚合,外部對象只聚合了一個aspect對象,但實際上,往往需要一個對象聚合多個aspect對象,這就是多面聚合。在完成多面聚合時,實現上并沒有多大的變化,就是創建多個aspect對象,多次調用EzAggregate方法使一個對象聚合多個aspect對象。請參閱圖7所示,其中是多面聚合的結果示意圖。
可以看出,構件對象指向下層被聚合的aspect對象指針(m_pAspect)構成了一個單向鏈表(聚合鏈),而鏈表中每一個aspect對象的m_pOuter指針都指向最外層的外部對象(聚合者)。通過這種方式,QureryInterface調用可以在鏈表中從頭向尾傳遞,而所有aspect對象的引用計數都委托給了最外層的外部對象。這與前面所介紹的兩個對象聚合的情況并沒有多大區別。
當然,上圖是一種比較理想的聚合情況,在某些情況下,下層aspect對象的m_pOuter指針可能會指向中間的aspect對象,最壞的情況是每一個aspect對象的m_pOuter指針都指向它相鄰的上層對象。雖然這樣也能正確運行,不影響執行的結果,但運行效率卻十分低下。
通過動態聚合和多面聚合,可以隨時隨地聚合一個或多個aspect對象,接下來就要實現動態拆卸聚合。
請參閱圖8所示,其中表示了動態拆卸聚合的過程,即從聚合鏈中找到要拆卸的aspect對象指針,然后從聚合鏈里將其剔除。
動態拆卸聚合也是通過對IObject接口中Aggregate方法的調用完成的。
m_pAspect->Aggregate(AggrType_Unaggregate,m_pOuter);
AggregateType類型指定了AggrType_Unaggregate,說明函數完成的是拆卸聚合行為。為了簡便,本發明的方法中的構件庫提供了EzUnaggregate函數來實現動態拆卸聚合
EZAPI EzUnaggregate(
/*[in]*/POBJECT pAggregator,
/*[in]*/REFEZCLSID rAspectClsid)
pAggregator為外部對象,rAspectClsid為aspect對象構件類的EZCLSID標識,這個函數實際上就是上面調用的封裝,使外部對象動態地拆卸某個已被聚合了的aspect對象,其大致的實現過程如下
1)外部對象通過要被拆卸的aspect對象標識在聚合鏈里找出相應的aspect對象IAspect接口指針;
2)與rAspectClsid匹配aspect對象斷開自己并維持剩余的聚合鏈表;
3)還原引用計數。由于在聚合時aspect對象將引用計數完全轉嫁到了外部對象,所以在拆卸的時候必須還原,還原的過程就是聚合時轉嫁的相反過程。
現實世界里,構件對象在聚合以及拆卸聚合時往往不是那么隨意,也就是說,聚合完成以及拆卸聚合的完成需要條件。如一只貓要想成為寵物店里的貓,這只貓必須要為人所喜愛,它才能成為寵物店里具有商品價值的貓(也就是貓可聚合寵物和商品兩個特征);相應地,寵物店里的貓要被賣出,至少需要達到一定的價錢,貓才可被人買走(也就是貓拆卸聚合了商品的特征)。為此本發明的方法在構件類實現時為構件的實現者提供一套可重載的虛函數來實現聚合和拆卸聚合時的制約。
對于本發明方法中的每個構件類(無論是聚合者還是aspect對象),構件的實現者可重載如下幾個函數來實現對該構件類對象在聚合或拆卸聚合時的制約
virtual CARAPI OnAspectAttaching(POBJECT pAspect);
virtual CARAPI OnAspectAttached(POBJECT pAspect);
virtual CARAPI OnAspectDetached(POBJECT pAspect);
其中CARAPI為宏,其定義如下
#define CARAPI unsigned int_stdcall
在聚合aspect對象時,在將aspect對象添加到聚合鏈之前,OnAspectAttaching函數會被觸發,當添加結束OnAspectAttached函數會被觸發。
在拆卸聚合時,功能是完成從聚合鏈里摘除被拆卸的aspect對象,在該實現完畢的時候會調用OnAspectDetached函數。
另外,對于aspect對象構件類,不但可重載如上三個虛函數,還可以重載如下兩個虛函數
virtual CARAPI OnAggregated(POBJECT pOuter);
virtual CARAPI OnUnaggregated(POBJECT pOuter);
聚合完成時,OnAggregated會被調用,拆卸聚合完成時,OnUnaggregated會被調用。
下面以一個簡化了的游戲來示例本發明的構件的動態聚合的方法。
在一些游戲里,游戲角色(Role)在游戲場景里揀到什么樣的工具就可以發揮此工具的特性,比如角色見到一把槍,就可以向敵人開火,揀到劍就能施展劍術等等,但是當角色扔掉工具后就不能發揮工具的特性了,沒有槍就不能開槍,沒有劍就不能施展劍術。在這個例子里我們只考慮一種很簡單的情況,那就是角色(Role)揀到了劍就能施展劍術(SwordPlay),角色扔掉了劍就不能施展劍術。我們將角色和劍術分別設計為構件類CRole和CSwordPlay,這樣可以減輕開發角色的負擔。可以描述這兩個構件類如下
module { interface IActionControl{ GetSword(); AbandonSword(); } interface ISwordFunctionality{ split(); thrust(); chop(); } class CRole{ interface IActionControl; } aspect CSwordPlay{ interface ISwordFunctionality; } }
其中的module描述了表示一個構件模塊。我們讓CRole和CSwordPlay分別實現IActionControl和ISwordFunctionality接口。CSwordPlay是一個aspect構件類,當Role揀到劍的時候會聚合CSwordPlay對象的ISwordFunctionality接口,扔掉劍的時候會拆卸聚合ISwordFunctionalitv接口。
上面的描述將其置于一個名為gamesam.car文件里,使用特定的編譯器以及自動代碼生成工具會生成構件的實現,而用戶只需關心自己定義的接口函數的實現,為此會生成CRole和CSwordPlay對各自接口函數的空實現,用戶只要填入我們自己的代碼就可以了,下面分別是這兩個類的cpp以及h文件
CRole.cpp #include″CRole.h″ #include″_CRole.cpp″ DECLARE_CLASSOBJECT(CRole) ECODE CRole∷GetSword() { m_bSwordPlay=TRUE; return NOERROR; } ECODE CRole∷AbandonSword() { m_bSwordPlay=FALSE; return NOERROR; } ECODE CRole∷OnAspectAttaching(POBJECT pObj) { if(!m_bSwordPlay)return E_FAIL; return NOERROR; }
其中的_CRole.cpp是生成的有關構件對象底層實現代碼,普通構件編寫者不用關心,在此不做介紹,下面的_CSwordPaly也類似。CAR構件還可以為每個構件類自動生成類產對象,DECLARE_CLASSOBJECT(CRole)宏就是為CRole生成類產對象,下面的DECLARE_CLASSOBJECT(CSwordPlay)是為CSwordPlay生成類產對象,再次只是簡單說明一下)
CRole.h #ifndef_CROLE_H_ #define_CROLE_H_ #include″_CRole.h″ class CRolepublic_CRole { public CARAPI GetSword(); CARAPI AbandonSword(); CARAPI OnAspectAttaching(POBJECT pAspect); private //TODO在這里添加用戶自己的私有成員變量 BOOLm_bSwordPlay; }; #endif//_CROLE_H
對于CRole,增加了聚合時的制約,在聚合時如果Role已經得到劍了,那么聚合CSwordPlay對象可以成功,若還沒有得到劍就不能聚合CSwordPlay對象。
CSwordPlay.cpp #include″CSwordPlay.h″ #include″_CSwordPlay.cpp″ #include<stdio.h> DECLARE_CLASSOBJECT(CSwordPlay) ECODE CSwordPlay∷split() { printf(″\nsplit!\n″); return NOERROR; } ECODE CSwordPlay∷thrust() { printf(″\nthrust!\n″); return NOERROR; } ECODE CSwordPlay∷chop() { printf(″\nchop!\n″); return NOERROR; } CSwordPlay.h #ifndef_CSWORDPLAY_H_ #define_CSWORDPLAY_H_ #include″_CSwordPlay.h″ class CSwordPlaypublic_CSwordPlay { public CARAPI split(); CARAPI thrust(); CARAPI chop(); private //TODOAdd your private member variables here. }; #endif//_CSWORDPLAY_H_
對于類CSwordPlay這里只是簡單地打印了劍的幾種行為。
下面就是客戶端的程序了
#include<stdio.h> ∥引用gamesam.dll $using gamesam.dll; int_cdecl main() { ECODE ec; IActionControl*pActionControl=NULL;<!-- SIPO <DP n="11"> --><dp n="d11"/>ISwordFunctionality*pSword=NULL;IObject*pSwordPlay=NULL;//創建Role對象,得到IActionControl指針pActionControlec=EzCreateObject(CLSID_CRole,CTX_SAME_DOMAIN,IID_IActionControl,(POBJECT*)&pActionControl);if(FAILED(ec))goto ErrorExit;//創建SwordPlay對象,得到其IObject指針pSwordPlayec=EzCreateInstance( CLSID_CSwordPlay, CTX_SAME_DOMAIN, IID_IObject, (POBJECT*)&pSwordPlay); if(FAILED(ec))goto ErrorExit; //Role得到劍 pActionControl->GetSword(); //Role得到了劍,可以施展劍術了,于是聚合SwordPlay對象 ec=EzAggregate((POBJECT)pActionControl,pSwordPlay); if(FAILED(ec)){ goto ErrorExit; } else{ //Role聚合SwordPlay對象成功,從Role對象里得到ISwordFunctionality指針pSword ec=pActionControl->QueryInterface(IID_ISwordFunctionality,(POBJECT*)&pSword); if(FAILED(ec))goto ErrorExit; } //Role施展劍術,使用劍的功能 pSword->split(); pSword->thrust(); pSword->chop(); pSword->Release(); //Role扔掉劍 pActionControl->AbandonSword(); //Role拆卸聚合SwordPlay對象,Role不能使用劍術 ec=EzUnaggregate((POBJECT)pActionControl,CLSID_CSwordPlay); if(FAILED(ec))goto ErrorExit; //Role已經扔掉劍再次想擁有劍術,于是聚合SwordPlay對象 ec=EzAggregate((POBJECT)pActionControl,pSwordPlay); if(FAILED(ec)){ //由于Role已經扔掉劍,所以不能施展劍術,所以不能聚合//SwordPlay對象,所以從 //Role對象里查詢不到ISwordFunctionality接口 ec=pActionControl->QueryInterface(IID_ISwordFunctionality,(POBJECT*)&pSword); if(FAILED(ec)){<!-- SIPO <DP n="12"> --><dp n="d12"/> printf(″No sword,No swordplay!\n″); } } if(pActionControl)pActionControl->Release(); if(pSwotdPlay)pSwordPlay->Release(); if(pSword)pSword->Release(); printf(″Game over!\n″); return 0; ErrorExit if(pActionControl)pActionControl->Release(); if(pSwordPlay)pSwordPlay->Release(); if(pSword)pSword->Release(); printf(″Exit with error!\n″); return 1; }
上面所列出的源代碼在本發明的手機嵌入式操作系統平臺下編譯開發的,其運行結果如下
split!
thrust!
chop!
No sword,No swordplay!
Game over!
結果與預期的完全相同。
采用了上述的實現計算機軟件系統中的構件動態聚合的方法,由于通過方面構件模型的對象實例與外部構件的對象實例進行交互操作,最終形成了外部構件對象實例內的聚合鏈表結構,不僅實現了動態聚合、動態拆卸的聚合模型,而且突破了COM只能在創建時聚合以及聚合之后不能拆卸的限制,可提高構件的復用度以及構件復用的靈活性;不僅如此,本發明的方法能夠提高構件接口的查詢和執行效率,增強系統運行的性能和穩定性,在構件的復用領域為面向構件編程提供了寬廣的空間,為軟件工廠化提供了一條簡便的途徑;并且提高了軟件的可擴展性,方便了用戶對不同需求的擴展,為構件化軟件系統的進一步發展奠定了堅實的基礎。
權利要求
1、一種實現計算機軟件系統中的構件動態聚合的方法,其特征在于,所述的方法包括構件動態聚合操作和構件動態拆卸聚合操作,該構件動態聚合操作包括以下步驟
(1)系統進行初始化操作;
(2)系統實例化方面構件類模型得到被聚合對象實例;
(3)系統實例化外部構件得到外部對象實例;
(4)如果該外部對象實例中不存在被聚合對象實例,則系統將被聚合對象實例的指針傳遞給外部對象實例,外部對象實例保存該指針;否則,系統將被聚合對象實例的指針傳遞給上一層被聚合對象實例,上一層被聚合對象實例保存該指針;
(5)系統將外部對象實例的指針或者上層被聚合對象實例的指針傳遞給該被聚合對象實例;
(6)被聚合對象實例保存相應的指針,形成聚合鏈表,并將該被聚合對象實例在系統中所有的引用計數全部加載到外部對象實例;
(7)完成動態聚合操作;
該構件動態拆卸聚合操作包括以下步驟
(1)系統將需要拆卸的被聚合對象實例的對象標識傳遞給所述的外部對象實例;
(2)該外部對象實例根據該對象標識在聚合鏈表中找出相應的被聚合對象實例的指針;
(3)該被聚合對象實例在聚合鏈表中進行摘除自身并維持剩余的聚合鏈表的處理;
(4)被聚合對象實例從外部對象實例中還原其在系統中所有的引用計數;
(5)完成動態拆卸聚合操作。
2、根據權利要求1所述的實現計算機軟件系統中的構件動態聚合的方法,其特征在于,所述的構件動態聚合操作中在步驟(4)之前還包括有以下步驟
(31)系統進行構件添加到聚合鏈表前的制約處理。
3、根據權利要求1所述的實現計算機軟件系統中的構件動態聚合的方法,其特征在于,所述的構件動態聚合操作中在步驟(7)之前還包括有以下步驟
(61)系統進行構件添加到聚合鏈表后的制約處理。
4、根據權利要求1所述的實現計算機軟件系統中的構件動態聚合的方法,其特征在于,所述的構件動態聚合操作中在步驟(7)之后還包括有以下步驟
(71)系統進行構件聚合完成后的制約處理。
5、根據權利要求1所述的實現計算機軟件系統中的構件動態聚合的方法,其特征在于,所述的構件動態拆卸聚合操作中在步驟(3)之后還包括有以下步驟
(31)系統進行構件從聚合鏈表摘除后的制約處理。
6、根據權利要求1所述的實現計算機軟件系統中的構件動態聚合的方法,其特征在于,所述的構件動態拆卸聚合操作中在步驟(5)之后還包括有以下步驟
(51)系統進行構件拆卸聚合完成后的制約處理。
7、根據權利要求1至6中任一項所述的實現計算機軟件系統中的構件動態聚合的方法,其特征在于,所述的方面構件類模型中具有方面接口,該方面接口中包括有接口查詢成員方法QueryInterface、添加引用成員方法AddRef、釋放成員方法Release和聚合成員方法Aggregate。
8、根據權利要求1至6中任一項所述的實現計算機軟件系統中的構件動態聚合的方法,其特征在于,所述的被聚合對象實例摘除自身并維持剩余的聚合鏈表的處理包括以下步驟
(1)該被聚合對象實例將自身保存的下一層被聚合對象實例的指針傳遞給上一層被聚合對象實例;
(2)上一層被聚合對象實例保存該指針;
(3)該被聚合對象實例將自身保存的外部對象實例的指針或者上層被聚合對象實例的指針傳遞給下一層被聚合對象實例;
(4)下一層被聚合對象實例保存該指針。
全文摘要
本發明涉及一種實現計算機軟件系統中的構件動態聚合的方法,其中包括聚合操作和拆卸操作,聚合操作包括分別實例化方面構件和外部構件得到被聚合對象和外部對象、外部對象保存或上一層被聚合對象保存被聚合對象指針、被聚合對象保存外部對象指針或上層被聚合對象指針形成聚合鏈表并將所有引用計數加載到外部對象,拆卸聚合操作包括外部對象根據需拆卸被聚合對象標識在聚合鏈表中找出相應的對象指針、在聚合鏈表中進行摘除并維持剩余的聚合鏈表、還原其在系統中所有的引用計數。采用該種實現計算機軟件系統中的構件動態聚合的方法,提高了構件復用度和復用靈活性,提高了構件接口的查詢和執行效率,增強系統運行的性能和穩定性。
文檔編號G06F9/44GK1851643SQ20061002712
公開日2006年10月25日 申請日期2006年5月30日 優先權日2006年5月30日
發明者蘇翼鵬, 陳榕, 黃凱峰 申請人:上海科泰世紀科技有限公司