今天我們學習如何基于ActorFramework實現(xiàn)MVC框架的設(shè)計。
本文教程:
基于ActorFramework的MVC設(shè)計實現(xiàn)
一、什么是MVC框架
MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫。
Model(模型)表示應(yīng)用程序核心(比如數(shù)據(jù)庫記錄列表)。是應(yīng)用程序中用于處理應(yīng)用程序數(shù)據(jù)邏輯的部分。
View(視圖)顯示數(shù)據(jù)(數(shù)據(jù)庫記錄)。是應(yīng)用程序中處理數(shù)據(jù)顯示的部分。通常視圖是依據(jù)模型數(shù)據(jù)創(chuàng)建的。
Controller(控制器)處理輸入(寫入數(shù)據(jù)庫記錄)。是應(yīng)用程序中處理用戶交互的部分。通常控制器負責從視圖讀取數(shù)據(jù),控制用戶輸入,并向模型發(fā)送數(shù)據(jù)。控制器本身不輸出任何東西和做任何處理。它只是接收請求并決定調(diào)用哪個模型構(gòu)件去處理請求,然后再確定用哪個視圖來顯示返回的數(shù)據(jù)。
如下圖數(shù)據(jù)庫操作的例子所示,MVC框架形成了一個閉環(huán),這也符合設(shè)計模式的開放-封閉原則。用戶與軟件的人機交互通過Controlloer控制器將用戶輸入的指令和數(shù)據(jù)傳遞給需要進行操作的模型,模型內(nèi)部進行一系列的算法邏輯,將輸出的結(jié)果反饋給VIEW視圖或更改不同的VIEW來更新不同的界面。用戶根據(jù)修改更新后的VIEW界面,再次進行新的人機交互。
接下來我們以一個擁有加、減法兩個Model的MVC為例,詳細講講如何在LabVIEW中實現(xiàn)Controller、VIEW、Model之間實現(xiàn)相互通訊的。
2、基于Actor Framework的VIEW
視圖是指用戶看到并與之交互的界面。在視圖中其實沒有真正的處理發(fā)生,它只是作為一種輸出數(shù)據(jù)并允許用戶操縱的方式。
(1)創(chuàng)建一個Actor,命名為User Interface。
(2)重寫Actor Core
在項目資源管理器中右鍵User Interface.lvclass→ VI forOverride...,選擇ActorCore.vi,保存ActorCore.vi。
(3)在重寫的Actor Core.vi程序框圖中創(chuàng)建一個“生產(chǎn)者”響應(yīng)用戶界面動作。
增加while循環(huán)嵌套事件結(jié)構(gòu)響應(yīng)界面動作;
增加Read Self Enqueuer.vi讀取當前Actor消息地址。位置:程序框圖 → Data Communication→ Actor Framework→ReadSelf Enqueuer.vi;
增加Read CallerEnqueuer.vi讀取當前Actor消息地址。位置:程序框圖→ Data Communication→ Actor Framework→Read CallerEnqueuer.vi;
增加打開、關(guān)閉Actor Core.vi前面板調(diào)用節(jié)點;
增加stop注冊事件停止“生產(chǎn)者”。
如此,一個可以響應(yīng)用戶操作的VIEW界面的程序框圖就搭完了,接下來我們在VIEW的前面板加上可以操控的控件。
當用戶輸入AB兩個數(shù)值,并按下加或減的按鈕后,VIEW將會產(chǎn)生事件,并通過調(diào)用Caller的隊列(即根操作者Controller)來向Controller發(fā)送數(shù)據(jù)和操作指令。
(4)創(chuàng)建結(jié)果控件的引用屬性
由于VIEW不僅需要完成用戶操作和數(shù)據(jù)的發(fā)送,也要完成Model執(zhí)行后的數(shù)據(jù)顯示,如果要在消息里將新值寫入VIEW的前面板控件,那么就需要用到控件的引用,所以我們在VIEW的屬性中添加數(shù)值控件的引用。
并在VIEW 的Actor Core.vi中,于啟動操作者之前將結(jié)果數(shù)值控件的引用寫入屬性中。
(5)創(chuàng)建顯示結(jié)果的消息
當Controller把結(jié)果發(fā)送給VIEW時,VIEW需要通過一個消息將結(jié)果值顯示在前面板上。所以需要創(chuàng)建一個基于靜態(tài)分配的模板,命名為Update Result.vi。在前面板添加結(jié)果數(shù)值控件,連接接線端并創(chuàng)建消息。
于程序框圖中將結(jié)果數(shù)據(jù)通過剛剛創(chuàng)建的引用放入前面板控件中顯示。
3、 基于Actor Framework的Model
模型表示業(yè)務(wù)規(guī)則,擁有最多的處理任務(wù)。被模型返回的數(shù)據(jù)是中立的,模型與數(shù)據(jù)格式無關(guān),這樣一個模型能為多個視圖提供數(shù)據(jù),由于應(yīng)用于模型的代碼只需寫一次就可以被多個視圖重用,所以減少了代碼的重復(fù)性。
在這里我們創(chuàng)建兩個Model,一個用來執(zhí)行加法操作的Model_Add,一個用來執(zhí)行減法操作的Model_Sub。
(1)創(chuàng)建兩個Actor,命名為Model_Add和Model_Sub。
(2)創(chuàng)建執(zhí)行操作的消息
于加法Model操作者中創(chuàng)建基于靜態(tài)分配模板的VI,命名為Add.vi。于其前面板中添加數(shù)值A(chǔ)與數(shù)值B的控件,連接接線端并為該VI創(chuàng)建消息。Controller發(fā)來的數(shù)據(jù)將會通過該VI的消息來進入Model執(zhí)行對應(yīng)的操作。
該VI執(zhí)行完加法操作后,需要將結(jié)果返回至Controller,Controller再將結(jié)果更新至VIEW。這樣便完成了一次C到M,M到V的操作。
那么該如何通過消息再將加好的結(jié)果送至Controller呢,就需要用到Controller的發(fā)送消息啦。程序框圖中先預(yù)留Read Caller Enqueue的接口,等Controller和更新數(shù)據(jù)的消息創(chuàng)建完成后再進行連接。
同樣的,為減法Model也創(chuàng)建一個用以執(zhí)行減法操作的VI,并創(chuàng)建消息。
4、 基于Actor Framework的Controller
控制器接受用戶的輸入并調(diào)用模型和視圖去完成用戶的需求,控制器本身不輸出任何東西和做任何處理。它只是接收請求并決定調(diào)用哪個模型構(gòu)件去處理請求,然后再確定用哪個視圖來顯示返回的數(shù)據(jù)。
(1)創(chuàng)建一個Actor,命名為Controller。
(2)重寫Actor Core
在項目資源管理器中右鍵User Interface.lvclass→ VI for Override...,選擇Actor Core.vi,保存Actor Core.vi。
(3)于ActorCore中啟動所有VIEW和Model
Controller作為MVC結(jié)構(gòu)的大腦,需要調(diào)用分配數(shù)據(jù)給對應(yīng)的VIEW和Model,所以Controller需要知道它的所有嵌套操作者的隊列地址。和普通隊列操作一樣,只有擁有了對方的地址才可以進行數(shù)據(jù)的傳輸。
于Controller的屬性中添加一個VIEW的隊列,兩個Model的隊列,這樣可以將啟動的嵌套操作者的隊列地址存放進Controller的屬性里,等數(shù)據(jù)發(fā)來就可以直接從屬性里取到對應(yīng)的地址進行消息的發(fā)送啦。
于Controller的Actor Core.vi中用Launch Nested Actor啟動VIEW和Model,并將產(chǎn)生的隊列放進剛剛創(chuàng)建好的Controller的屬性中。
(4)創(chuàng)建接收VIEW數(shù)據(jù)的消息
于Controller中創(chuàng)建用以接收VIEW數(shù)據(jù)和執(zhí)行操作的消息,創(chuàng)建基于靜態(tài)分配模板的VI,命名為Choose Model.vi。
該VI中創(chuàng)建數(shù)組A和數(shù)值B兩個數(shù)值輸入控件和一個枚舉控件,并為其連接接線端,創(chuàng)建消息。
枚舉輸入端用以決定VIEW中用戶操作的事件是減法還是加法,數(shù)值輸入端用以將VIEW中傳來的數(shù)據(jù)轉(zhuǎn)發(fā)給對應(yīng)操作的Model。故于程序框圖中增加條件結(jié)構(gòu),當VIEW的操作為加法時,將數(shù)值A(chǔ)和數(shù)值B發(fā)送給Model_Add進行加法操作,當VIEW的操作為減法時,將數(shù)值A(chǔ)和數(shù)值B發(fā)送給Model_Sub進行減法操作。此時就用到了剛剛存下來的隊列啦!
可以看到上圖中對操作進行了判斷,并選取了不同的Model隊列用來執(zhí)行不同的操作。注意把數(shù)據(jù)發(fā)送給Model的操作是通過之前創(chuàng)建的Model消息來實現(xiàn)的哦!
(5)創(chuàng)建接收Model數(shù)據(jù)的消息
Controller不僅需要接收VIEW傳來的數(shù)據(jù)和操作,也需要接收Model傳來的執(zhí)行結(jié)果和反饋。
于Controller中創(chuàng)建用以接收Model數(shù)據(jù)和反饋的消息,創(chuàng)建基于靜態(tài)分配模板的VI,命名為Update Data.vi。
該VI中創(chuàng)建一個結(jié)果數(shù)值控件,連接接線端并創(chuàng)建消息。
由于Controller接收到Model返回的數(shù)值后需要把結(jié)果告知VIEW并顯示,所以在接收Model數(shù)據(jù)的同時需要將結(jié)果通過消息發(fā)送給VIEW。所以要在接收Model數(shù)據(jù)后向VIEW發(fā)送該結(jié)果數(shù)據(jù)。
上圖就展示了如何在Controller接收結(jié)果數(shù)據(jù)后發(fā)送給VIEW的程序框圖,圖中運用到的發(fā)送Update Result.vi即前面創(chuàng)建過的VIEW消息。
5、 啟動程序
所有模塊都構(gòu)建完成,接下來就是啟動核心操作者啦。
創(chuàng)建一個名為Launcher.vi的普通VI,于程序框圖中將Controller啟動。
啟動該VI后,可以看到彈出了VIEW的頁面,輸入數(shù)值A(chǔ)和B后,按下加法按鈕,可以看到結(jié)果控件中展示了加法的結(jié)果。
6、 MVC鏈路總結(jié)
大家發(fā)現(xiàn)沒有,MVC的鏈路總是一環(huán)套一環(huán),V的操作和數(shù)據(jù)通過消息發(fā)送給Controller,Controller再將其轉(zhuǎn)發(fā)給對應(yīng)的Model,Model執(zhí)行完畢后又將結(jié)果數(shù)據(jù)發(fā)送給Controller,Controller再將結(jié)果數(shù)據(jù)轉(zhuǎn)發(fā)給VIEW顯示。Controller就是整個MVC的大腦,它決定了數(shù)據(jù)該去往何處。Model就是執(zhí)行操作的執(zhí)行官,他不考慮這些數(shù)據(jù)是從哪里來的,它只關(guān)心對這些數(shù)據(jù)的操作,并將結(jié)果返回給調(diào)用它的操作者。而VIEW根本不考慮數(shù)據(jù)的流程和操作,它只用把用戶觸發(fā)的事件通過消息傳送給大腦,再一直接收Controller發(fā)來的數(shù)據(jù)而已。
雖然看起來是密不可分的,但大腦只要知道了數(shù)據(jù)該發(fā)往何處,就可以通過更改隊列地址來改變數(shù)據(jù)的操作。而VIEW和Model也可以無限擴展,只要告訴大腦它們的地址就可以了。
更高級一些,就是Model和VIEW不通過Controller直接進行相互數(shù)據(jù)的發(fā)送,那這就是所謂的MVVM結(jié)構(gòu)啦。
對于加減法的運用來說,MVC架構(gòu)太空太大了,但是對于更龐大更復(fù)雜的項目呢,考慮使用MVC架構(gòu)和抽象就可以變成低耦合的程序,每個模塊的修改都可以獨立于整個程序,是不是更加方便了呢?
以上就是如何在LabVIEW中為ActorFramework構(gòu)建MVC架構(gòu)的方法。 對Actor Framework感興趣的工程師們,歡迎持續(xù)關(guān)注、留言和點贊,也可以私信小編各位的技術(shù)困惑和技術(shù)需求,以獲取參加免費線下培訓(xùn)和技術(shù)交流的機會哦。
審核編輯:湯梓紅
-
控制器
+關(guān)注
關(guān)注
112文章
16103瀏覽量
177077 -
LabVIEW
+關(guān)注
關(guān)注
1961文章
3651瀏覽量
322004 -
Framework
+關(guān)注
關(guān)注
0文章
24瀏覽量
8566 -
MVC
+關(guān)注
關(guān)注
0文章
73瀏覽量
13831
原文標題:教程 | 基于Actor Framework的MVC設(shè)計實現(xiàn)
文章出處:【微信號:華穗科技,微信公眾號:華穗科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論