• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      設(shè)計(jì)模式在開(kāi)發(fā)模擬器終端軟件中的應(yīng)用

      2023-10-20 08:41:58樊建平宋眾艷
      火力與指揮控制 2023年7期
      關(guān)鍵詞:窗體設(shè)計(jì)模式觀察者

      樊建平,宋眾艷,朱 胤,陳 濤,李 波

      (北方自動(dòng)控制技術(shù)研究所,太原 030006)

      0 引言

      QT 是一種C++應(yīng)用程序開(kāi)發(fā)框架,用于圖形用戶(hù)界面應(yīng)用程序開(kāi)發(fā),擁有C++的性能、跨平臺(tái)的特點(diǎn)、高質(zhì)量的文檔。軟件開(kāi)發(fā)人員在模擬器終端界面編程時(shí),常用的方法是將窗體界面及界面中包含的所有控件放在同一個(gè)模塊中,窗體類(lèi)、各個(gè)控件對(duì)象之間互相可見(jiàn),均可直接訪問(wèn)。這種方法特點(diǎn)是邏輯簡(jiǎn)單、實(shí)現(xiàn)容易、上手快、易學(xué)易用。

      雖然上述方法具有簡(jiǎn)單易用的優(yōu)點(diǎn),但也存在明顯的缺點(diǎn)。首先,界面上所有的控件編碼均在同一個(gè)模塊中實(shí)現(xiàn),導(dǎo)致各個(gè)控件的代碼交織在一起,控件、方法取名時(shí)容易沖突,調(diào)用時(shí)容易出錯(cuò),修改和升級(jí)界面時(shí),容易改錯(cuò)、不易維護(hù)。其次,由于所有控件都在同一個(gè)模塊中,與控件相關(guān)聯(lián)的邏輯功能的實(shí)現(xiàn)也被局限在同一個(gè)模塊,這些邏輯功能結(jié)構(gòu)松散、互相交織,導(dǎo)致這個(gè)界面模塊無(wú)法體現(xiàn)出清晰的設(shè)計(jì)思路和工作邏輯。

      本文提出一種終端界面編程方法,基于組合(composite)設(shè)計(jì)模式與觀察者(observer)設(shè)計(jì)模式[1],可實(shí)現(xiàn)直接快速解決終端界面解耦和邏輯梳理問(wèn)題。

      1 組合與觀察者設(shè)計(jì)模式

      設(shè)計(jì)模式解決軟件開(kāi)發(fā)人員面臨的一般性問(wèn)題。設(shè)計(jì)模式具有復(fù)用解決方案[2]、確立通用術(shù)語(yǔ)、提高觀察高度、軟件更易修改維護(hù)等優(yōu)點(diǎn)[3]。

      1.1 組合模式

      組合模式是設(shè)計(jì)模式中的一種[4],可以描述成部分與整體的層次結(jié)構(gòu),這樣的結(jié)構(gòu)可以用對(duì)象組合成樹(shù)的形式來(lái)表示。單個(gè)對(duì)象和組合對(duì)象的使用,對(duì)用戶(hù)來(lái)說(shuō)具有一致性。組合模式結(jié)構(gòu)[5]如圖1 所示。

      圖1 組合模式結(jié)構(gòu)Fig.1 Combination mode structure

      組合模式對(duì)象結(jié)構(gòu)如圖2 所示。

      圖2 組合模式對(duì)象結(jié)構(gòu)Fig.2 Object structure in combination mode

      部件(component):聲明組合中對(duì)象的接口并實(shí)現(xiàn)共同接口的缺省行為。

      葉子(leaf):在組合中表示葉子節(jié)點(diǎn)對(duì)象并定義葉子對(duì)象行為。

      組合(composite):定義部件的行為;含有子部件;在接口中實(shí)現(xiàn)與子部件相關(guān)的操作。

      客戶(hù)(client):通過(guò)部件的接口操縱組合部件的對(duì)象。

      客戶(hù)通過(guò)使用部件類(lèi)接口,與組合結(jié)構(gòu)中的對(duì)象進(jìn)行交互。如果接收者是一個(gè)葉節(jié)點(diǎn),便直接處理請(qǐng)求。如果接收者是一個(gè)組合,通常將請(qǐng)求發(fā)送給其子部件。在轉(zhuǎn)發(fā)客戶(hù)請(qǐng)求之前或之后可能執(zhí)行一些輔助操作。

      1.2 觀察者模式

      觀察者模式是設(shè)計(jì)模式中的一種。觀察者設(shè)計(jì)模式定義對(duì)象之間是一種一對(duì)多的相互依賴(lài)關(guān)系。通過(guò)一個(gè)類(lèi)(觀察者)在另一個(gè)類(lèi)(主體)中注冊(cè)通知的方式,當(dāng)一個(gè)對(duì)象(主體)的狀態(tài)發(fā)生改變時(shí),所有依賴(lài)它的對(duì)象(觀察者)都得到通知,并被自動(dòng)更新,使概念上不相關(guān)的類(lèi)之間可以相互通信[6]。觀察者模式結(jié)構(gòu)圖如圖3 所示。

      圖3 觀察者模式結(jié)構(gòu)Fig.3 Observer mode structure

      目標(biāo)(subject):維護(hù)一個(gè)包含所有觀察者引用的列表。

      觀察者(observer):定義了一個(gè)更新接口,當(dāng)目標(biāo)狀態(tài)發(fā)生改變時(shí),觀察者通過(guò)這個(gè)接口獲得通知進(jìn)行更新。

      具體目標(biāo)(concrete subject):當(dāng)自身狀態(tài)發(fā)生變化時(shí),便利包含所有觀察者引用的列表發(fā)出通知。

      具體觀察者(concrete observer):收到一個(gè)具體目標(biāo)改變的通知后,通過(guò)重載父類(lèi)觀察者的更新接口,保存目標(biāo)最新?tīng)顟B(tài)。

      2 基于設(shè)計(jì)模式的分析步驟

      2.1 QT 界面設(shè)計(jì)應(yīng)用組合模式

      2.1.1 QT 界面與組合模式

      在QT 的界面窗體中,一個(gè)控件可以看作一個(gè)葉子節(jié)點(diǎn),一組關(guān)聯(lián)的控件可以看作一個(gè)部件。

      當(dāng)這個(gè)界面窗體作為子窗體嵌入到另一個(gè)界面窗體時(shí),這個(gè)界面窗體又可以看作部件,被嵌入的窗體可以看作根部件。

      依此類(lèi)推,控件、窗體、子窗體互相組合與遞歸,形成不同層次的葉子節(jié)點(diǎn)與部件,構(gòu)成了樹(shù)形結(jié)構(gòu),即典型的組合模式樹(shù)形描述[7]。

      作為根節(jié)點(diǎn)的窗體部件接收到處理請(qǐng)求,會(huì)將請(qǐng)求發(fā)送給它的接收者,如果接收者是一個(gè)葉節(jié)點(diǎn),便直接處理請(qǐng)求;如果接收者是一個(gè)部件,部件則將請(qǐng)求發(fā)送給它的子部件。這樣傳遞請(qǐng)求,直到請(qǐng)求到達(dá)每一個(gè)葉節(jié)點(diǎn)。

      2.1.2 QT 中組合模式的實(shí)現(xiàn)

      QT 中組合模式的實(shí)現(xiàn)依賴(lài)QT 自定義窗體的“提升”功能。自定義窗體對(duì)應(yīng)組合模式中的部件或葉子?!疤嵘绷鞒倘鐖D4 所示。

      圖4 “提升”流程圖Fig.4 “Promotion”flow chart

      1)將一個(gè)窗體作為樹(shù)的根節(jié)點(diǎn)

      在這個(gè)窗體中,設(shè)計(jì)包含若干個(gè)部件(節(jié)點(diǎn)或葉子),其中每一個(gè)部件設(shè)計(jì)包含若干個(gè)子部件(節(jié)點(diǎn)或葉子)。

      2)將自定義窗體作為樹(shù)的節(jié)點(diǎn)

      使用QT 控件Widget 在根節(jié)點(diǎn)窗體中進(jìn)行“占位”。即將控件Widget 拖入界面設(shè)計(jì)好的位置。

      在QT 中新建自定義窗體,使其大小與進(jìn)行“占位”的Widget 控件匹配。

      在自定義窗體中,根據(jù)實(shí)際需求設(shè)計(jì)放置若干QT 控件并設(shè)計(jì)接口,實(shí)現(xiàn)自定義窗口數(shù)據(jù)更新及數(shù)據(jù)表現(xiàn)。

      3)通過(guò)“提升”功能實(shí)現(xiàn)樹(shù)的構(gòu)造

      使用QT 編程環(huán)境Creator 的“提升”功能,將自定義窗體與“占位”的模塊進(jìn)行結(jié)合,自定義窗體替換掉了原來(lái)界面的“占位”控件,就可以通過(guò)這個(gè)自定義窗體類(lèi)的指針,在根窗體中來(lái)訪問(wèn)這個(gè)窗體上的所有控件。

      通過(guò)以上3 個(gè)步驟,利用QT 的“提升”功能,構(gòu)成了組合模式結(jié)構(gòu),同時(shí)由于每個(gè)窗體部件是單獨(dú)新建,因此,解耦了界面,降低了界面復(fù)雜性,使得各模塊易編碼易維護(hù)。

      2.2 觀察者模式的應(yīng)用

      根據(jù)2.1 節(jié),對(duì)根節(jié)點(diǎn)窗體部件以及其包含的各個(gè)子部件應(yīng)用觀察者設(shè)計(jì)模式。根節(jié)點(diǎn)窗體部件作為主體即觀察的目標(biāo),各子部件作為觀察者即觀察主體狀態(tài)變化的對(duì)象。觀察者設(shè)計(jì)模式應(yīng)用流程如圖5 所示。

      圖5 觀察者模式應(yīng)用流程Fig.5 Application process of observer mode

      1)注冊(cè)觀察者。在根節(jié)點(diǎn)窗體部件中注冊(cè)觀察者,即維護(hù)一個(gè)包含所有觀察者引用的列表。

      2)當(dāng)有更新數(shù)據(jù)時(shí),通知觀察者。當(dāng)根節(jié)點(diǎn)窗體得到更新數(shù)據(jù)時(shí),通知各個(gè)觀察者,遍歷包含有觀察者引用的列表,各個(gè)觀察者調(diào)用各自實(shí)現(xiàn)的更新接口,獲取數(shù)據(jù)、更新?tīng)顟B(tài)。

      3)使用推或拉模式更新觀察者。觀察者獲取數(shù)據(jù)有兩種方式,一種是拉模型,一種是推模型。所謂拉模式,指通過(guò)引用主體取得主體接口GetData 來(lái)獲取所關(guān)注的數(shù)據(jù);所謂推模式,指主體直接將觀察者需要的數(shù)據(jù)作為接口Updata 參數(shù),傳給觀察者。

      通過(guò)以上3 個(gè)步驟,利用觀察者模式,將主體與觀察者解耦、降低各模塊間耦合、各模塊自動(dòng)更新,梳理了工作邏輯。

      3 實(shí)例分析

      以某型模擬器炮長(zhǎng)終端軟件作為實(shí)例,來(lái)詳述其技術(shù)方案。技術(shù)路線概要如圖6 所示。

      圖6 技術(shù)路線Fig.6 Technology roadmap

      3.1 界面分解

      3.1.1 模塊劃分

      按照實(shí)裝界面形式與功能,進(jìn)行界面的模塊劃分。

      實(shí)裝的炮長(zhǎng)終端上部顯示當(dāng)前的工作狀態(tài),下部顯示各個(gè)功能界面。按照界面形式與功能,進(jìn)行界面的模塊劃分[8],可將界面初步劃分為上下兩個(gè)部分。

      軟件上部為顯示狀態(tài)的區(qū)域,下部分為人機(jī)交互的區(qū)域(包括信息輸入和信息顯示)。下部分人機(jī)交互區(qū)域包括多個(gè)子功能區(qū)域,因此,進(jìn)行第2 層劃分,每個(gè)子功能區(qū)域?qū)?yīng)的劃分為一個(gè)界面模塊。這些子功能區(qū)域?qū)?yīng)的界面以一組標(biāo)簽頁(yè)進(jìn)行組織。

      這樣界面劃分共分兩個(gè)層次,第1 個(gè)層次劃分為上下兩部分,第2 個(gè)層次,下部分再次劃分為若干個(gè)部分。

      3.1.2 界面設(shè)計(jì)

      使用Qt Creator 開(kāi)發(fā)環(huán)境,新建QT 工程,根據(jù)前述模塊劃分方案進(jìn)行界面設(shè)計(jì)。

      Step 1 使用QT 控件Widget 進(jìn)行“占位”

      1)新建Application 項(xiàng)目,選擇Qt Widges Application,建立工程;

      2)在工程中打開(kāi)ui 界面,按照劃分設(shè)計(jì),在上部分拖動(dòng)放置一個(gè)QT 容器類(lèi)的控件Widget,作為狀態(tài)模塊;

      3)在下半部分,拖動(dòng)放置一個(gè)QT 容器類(lèi)的控件Stacked Widge,作為功能模塊;選中此控件,通過(guò)右鍵菜中插入5 個(gè)Widget,這5 個(gè)Widget 分別對(duì)應(yīng)5 個(gè)功能界面。

      Step 2 創(chuàng)建自定義窗體,根據(jù)前述的“占位”控件,新建窗體類(lèi)與占位控件對(duì)應(yīng)。

      1)在Creator 中,通過(guò)工程中添加新文件,自定義一個(gè)派生于QWidget 類(lèi),完成后工程中就添加了新類(lèi)和對(duì)應(yīng)的窗體;

      2)在窗體中按照實(shí)裝界面進(jìn)添加需要的控件;

      3)按照上述步驟,分別對(duì)劃分后的每一個(gè)模塊建立自定義窗體、添加控件使與實(shí)裝界面一致。

      Step 3 提升窗體,將自定義窗體與“占位”的模塊進(jìn)行結(jié)合。

      1)在ui 界面中,選中上半部分模塊(占位控件),進(jìn)行提升,提升后模塊的類(lèi)名變?yōu)樽远x窗體的類(lèi)名;

      2)同樣,對(duì)所有劃分的區(qū)域(占位控件)進(jìn)行提升操作。

      這樣就將自定義窗體替換掉了原來(lái)界面的“占位”控件。在占位控件所在的窗體中,就可以通過(guò)這個(gè)自定義窗體類(lèi)的指針來(lái)訪問(wèn)自定義窗體中的所有控件。

      3.2 工作邏輯梳理

      將3.1 節(jié)界面分解得到的多個(gè)模塊作為輸入,采用觀察者設(shè)計(jì)模式,對(duì)程序工作邏輯進(jìn)行梳理。

      3.2.1 應(yīng)用觀察者模式

      對(duì)前述界面劃分出的多個(gè)模塊應(yīng)用觀察者模式,結(jié)合本實(shí)例,觀察者模式結(jié)構(gòu)圖如圖7 所示。

      圖7 觀察者模式結(jié)構(gòu)Fig.7 Observer mode structure

      圖7 中,主體(被觀察的目標(biāo))是通信類(lèi)(My-Communication);觀察者是基類(lèi),定義虛函數(shù)作為更新數(shù)據(jù)接口;所有具體的觀察者繼承這個(gè)基類(lèi)并各自實(shí)現(xiàn)更新數(shù)據(jù)的接口。

      具體的觀察者分別是:狀態(tài)窗體、參數(shù)輸入窗體、自檢窗體、穩(wěn)像窗體、裝表窗體、校炮窗體。

      觀察者所觀察的內(nèi)容為通信類(lèi)中得到的硬件實(shí)體按鍵、開(kāi)關(guān)消息,以及來(lái)自火控仿真軟件的系統(tǒng)狀態(tài)與諸元信息。

      3.2.2 觀察者模式工作流程

      Step 1 注冊(cè)觀察者:在通信類(lèi)中注冊(cè)各個(gè)觀察者,即維護(hù)一個(gè)包含所有觀察者引用的列表;

      Step 2 當(dāng)有更新數(shù)據(jù)時(shí),通知觀察者:通信類(lèi)得到更新數(shù)據(jù)時(shí),通知各個(gè)觀察者,遍歷包含有觀察者引用的列表,各個(gè)觀察者調(diào)用各自實(shí)現(xiàn)的更新接口,獲取數(shù)據(jù)(實(shí)體按鍵、開(kāi)關(guān)消息,以及來(lái)自火控仿真軟件的系統(tǒng)狀態(tài)與諸元信息);

      Step 3 使用推或拉模式更新觀察者:觀察者獲取數(shù)據(jù)有兩種方式,一種是拉模型,另一種是推模型。

      在本實(shí)例中,同時(shí)使用這兩種方式來(lái)獲取數(shù)據(jù),如序列圖8、下頁(yè)圖9 所示。

      圖8 數(shù)據(jù)拉模型Fig.8 Data pull model

      圖9 數(shù)據(jù)推模式Fig.9 Data push modes

      在本實(shí)例中,采用拉模式獲取火控仿真軟件狀態(tài)幀和諸元幀,采用推模式獲取按鍵信息。

      4 結(jié)論

      綜上所述,基于QT 編程環(huán)境,采用組合設(shè)計(jì)模式與觀察者模式進(jìn)行終端界面編程,是一種新的界面編程方法,其創(chuàng)新之處在于在采用組合設(shè)計(jì)模式之后,對(duì)樹(shù)形的各個(gè)節(jié)點(diǎn)應(yīng)用觀察者模式、組合模式的結(jié)果作為觀察者模式的輸入,前者解決界面解耦,后者解決邏輯梳理,不僅使程序開(kāi)發(fā)效率得到提升,而且程序的維護(hù)升級(jí)更為容易。利用本文方法,通過(guò)對(duì)某型模擬器炮長(zhǎng)終端軟件的實(shí)例,再次證明這一點(diǎn)。但本文中應(yīng)用的組合模式、觀察者模式都有一定的適用范圍,解決的問(wèn)題有一定的局限,如何應(yīng)用其他的設(shè)計(jì)模式解決更多的問(wèn)題,都有待進(jìn)一步分析、解決。

      猜你喜歡
      窗體設(shè)計(jì)模式觀察者
      觀察者
      仿生設(shè)計(jì)模式的創(chuàng)新應(yīng)用探索
      玩具世界(2023年6期)2024-01-29 12:14:36
      “1+1”作業(yè)設(shè)計(jì)模式的實(shí)踐探索
      試談Access 2007數(shù)據(jù)庫(kù)在林業(yè)檔案管理中的應(yīng)用
      檔案天地(2019年5期)2019-06-12 05:12:02
      冷靜而又理性的觀察者——德國(guó)華人作家劉瑛訪談
      交通機(jī)電工程設(shè)計(jì)模式創(chuàng)新探討
      基于LayeredWindow的異形窗體局部刷新
      中文信息(2014年2期)2014-03-06 23:49:14
      互動(dòng)式設(shè)計(jì)模式研究
      巧設(shè)WPS窗體控件讓表格填寫(xiě)更規(guī)范
      觀察者模式在Java 事件處理中的應(yīng)用研究*
      山阳县| 高州市| 连城县| 浏阳市| 韩城市| 孟连| 周至县| 元氏县| 鄂温| 会宁县| 彩票| 阜平县| 平遥县| 阳曲县| 阿拉善右旗| 汝南县| 寻乌县| 抚顺县| 科技| 潼南县| 瑞金市| 肇东市| 东丽区| 屏东市| 周至县| 法库县| 祁连县| 福泉市| 建德市| 阿瓦提县| 蓝田县| 新民市| 当阳市| 邯郸县| 什邡市| 香河县| 安远县| 咸丰县| 措美县| 呼和浩特市| 稻城县|