俗話說:欲速不達(dá),昨天想著趕緊實(shí)現(xiàn)LngosHook,但思路很混亂,寫了很多代碼,也刪除了很多,最后只留下一個(gè)Hook對象。俗話又說:磨刀不誤砍柴工,于是今天空出的時(shí)間不多,就靜下心了,想了想該如何實(shí)現(xiàn)LingosHook。于是就有了下面的圖.
MainFrame是界面部分,由wxGlade設(shè)計(jì)并自動生成wxWidgets代碼,以我的習(xí)慣,這部分怕會是換來換去,要是主要代碼寫在其中,那么每次重新生成MainFrame時(shí)就要重寫,這太。。煩了。因此將主要功能分隔在多個(gè)獨(dú)立的對象中處理,對象間通過引用或者引用變量來分離功能間的耦合。
HookObject負(fù)責(zé)注冊、卸載Hook,處理由Hook發(fā)來的指定消息,將收到的TEXT和HTML數(shù)據(jù)通過_objResultProc引用,傳遞給ResultProcObject對象處理;
ResultProcObject負(fù)責(zé)處理收到的數(shù)據(jù),并通過_objDBAccess引用交有DBAccess對象操作數(shù)據(jù)庫,并通過_objDisplayProc和_ctrlTrace引用通知DisplayProcObject,MainFrame數(shù)據(jù)的變化;
DisplayProcObject負(fù)責(zé)顯示工作,包括Index和Result,這樣需要通過_objDBAccess引用訪問數(shù)據(jù)庫;
DBAccess對象作為單一的數(shù)據(jù)庫訪問接口放置多路訪問數(shù)據(jù)庫,需要提供訪問所需各自API操作接口;
由上圖可知,所有對象都是MainFrame的成員,由MainFrame負(fù)責(zé)初始和管理,根據(jù)圖形關(guān)系可以看出,如果對象間的引用在對象初始時(shí)通過構(gòu)造函數(shù)傳入,那么初始順序?yàn)镈BAccess,DisplayProcObject,ResultProcObject, HookObject,且除了DBAccess外,其他對象的是實(shí)例為指針方式存在。
就這些。