亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

        2023-10-20 08:41:58樊建平宋眾艷
        火力與指揮控制 2023年7期
        關(guān)鍵詞:界面

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

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

        0 引言

        QT 是一種C++應(yīng)用程序開(kāi)發(fā)框架,用于圖形用戶界面應(yīng)用程序開(kāi)發(fā),擁有C++的性能、跨平臺(tái)的特點(diǎn)、高質(zhì)量的文檔。軟件開(kāi)發(fā)人員在模擬器終端界面編程時(shí),常用的方法是將窗體界面及界面中包含的所有控件放在同一個(gè)模塊中,窗體類、各個(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ì)用戶來(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)的操作。

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

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

        1.2 觀察者模式

        觀察者模式是設(shè)計(jì)模式中的一種。觀察者設(shè)計(jì)模式定義對(duì)象之間是一種一對(duì)多的相互依賴關(guān)系。通過(guò)一個(gè)類(觀察者)在另一個(gè)類(主體)中注冊(cè)通知的方式,當(dāng)一個(gè)對(duì)象(主體)的狀態(tài)發(fā)生改變時(shí),所有依賴它的對(duì)象(觀察者)都得到通知,并被自動(dòng)更新,使概念上不相關(guān)的類之間可以相互通信[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ò)重載父類觀察者的更新接口,保存目標(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è)界面窗體又可以看作部件,被嵌入的窗體可以看作根部件。

        依此類推,控件、窗體、子窗體互相組合與遞歸,形成不同層次的葉子節(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)依賴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)訪問(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 容器類的控件Widget,作為狀態(tài)模塊;

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

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

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

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

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

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

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

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

        這樣就將自定義窗體替換掉了原來(lái)界面的“占位”控件。在占位控件所在的窗體中,就可以通過(guò)這個(gè)自定義窗體類的指針來(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))是通信類(My-Communication);觀察者是基類,定義虛函數(shù)作為更新數(shù)據(jù)接口;所有具體的觀察者繼承這個(gè)基類并各自實(shí)現(xiàn)更新數(shù)據(jù)的接口。

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

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

        3.2.2 觀察者模式工作流程

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

        Step 2 當(dāng)有更新數(shù)據(jù)時(shí),通知觀察者:通信類得到更新數(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ì)算分析
        微重力下兩相控溫型儲(chǔ)液器內(nèi)氣液界面仿真分析
        國(guó)企黨委前置研究的“四個(gè)界面”
        基于FANUC PICTURE的虛擬軸坐標(biāo)顯示界面開(kāi)發(fā)方法研究
        西門(mén)子Easy Screen對(duì)倒棱機(jī)床界面二次開(kāi)發(fā)
        空間界面
        金秋(2017年4期)2017-06-07 08:22:16
        鐵電隧道結(jié)界面效應(yīng)與界面調(diào)控
        電子顯微打開(kāi)材料界面世界之門(mén)
        人機(jī)交互界面發(fā)展趨勢(shì)研究
        手機(jī)界面中圖形符號(hào)的發(fā)展趨向
        新聞傳播(2015年11期)2015-07-18 11:15:04
        亚洲伊人久久大香线蕉| 97超级碰碰人妻中文字幕 | 国产二区中文字幕在线观看| 在线观看av网站永久| 乌克兰少妇xxxx做受野外| 无码人妻少妇久久中文字幕蜜桃 | 高清国产精品一区二区| 天天综合天天爱天天做| 免费无码一区二区三区蜜桃大 | 日本一二三区免费在线| 欧美人妻少妇精品久久黑人| 四虎4545www国产精品| 亚洲一区二区三区在线观看| 国产精品无套一区二区久久| 国产福利不卡视频在线| 无套内内射视频网站| 日韩精品无码av中文无码版| 精品国产AⅤ一区二区三区V免费| 日韩有码中文字幕在线视频 | 国产成人无码免费视频在线| 狠狠躁狠狠躁东京热无码专区| 日本女优中文字幕有码| 香港三级日本三韩级人妇久久| 国内精品久久久人妻中文字幕| 亚洲首页一区任你躁xxxxx| 狠狠亚洲超碰狼人久久老人| 中文字幕成人精品久久不卡91| 国产精品二区一区二区aⅴ污介绍| 欧美成年黄网站色视频| 人妻无码∧V一区二区| 加勒比婷婷色综合久久| a级毛片100部免费观看| 国产免费一级在线观看| 少妇人妻一区二区三飞| 中文字幕日韩人妻在线视频| 放荡的闷骚娇妻h| 一区二区三区国产精品| 亚洲综合网国产精品一区| 天天爽夜夜爽夜夜爽| 日韩欧美精品有码在线观看| 久久精品久99精品免费|