青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

好久沒(méi)寫博客,轉(zhuǎn)管理后技術(shù)有些荒廢, 貌似現(xiàn)在流行知乎live和微信公眾號(hào), 博客已經(jīng)有些過(guò)時(shí)了,但關(guān)鍵是你對(duì)技術(shù)的思考和總結(jié), 采用什么方式其實(shí)不重要。

現(xiàn)代大型客戶端軟件,考慮到各種終端類型(Windows, Mac, ios, Android...),大部分采用分層設(shè)計(jì),用C++封裝跨平臺(tái)的SDK/Framework, UI層采用各平臺(tái)Native語(yǔ)言實(shí)現(xiàn)(C++/Java/objective-c),典型的分層如下:


最近工作要對(duì)UI層進(jìn)行重構(gòu),對(duì)UI層的設(shè)計(jì)進(jìn)行了一些思考,UI層是客戶端直接和用戶交互的那層,它的好壞直接影響到整個(gè) 產(chǎn)品的用戶體驗(yàn), 重要性不言而喻。但是很多時(shí)候我們卻很難將這層代碼寫好,給用戶良好的用戶體驗(yàn), 主要下面一些因素:
(1)邏輯復(fù)雜性, 因?yàn)檫@層是整個(gè)客戶端所有feature的最終集成地
(2)各種屏幕尺寸的適配,這個(gè)Mobile上更明顯
(3)Accessibility的支持: tab導(dǎo)航,高對(duì)比,高DPI, 讀屏...
(4) 換膚和多語(yǔ)言

上面問(wèn)題(2)(3)(4)都是和具體平臺(tái)系統(tǒng)相關(guān)的,這里我們重點(diǎn)關(guān)注如何解決問(wèn)題(1), 也就是如何通過(guò)合理的設(shè)計(jì)降低UI層的復(fù)雜性, 因?yàn)閁I層的代碼往往寫到最后變成了"一坨屎"。

其實(shí)UI層的設(shè)計(jì)已經(jīng)有很多成熟的模式,我們依次看下:

(1) Original MVC

這是最早的的MVC模式, 據(jù)說(shuō)最早的計(jì)算機(jī)鼠標(biāo)鍵盤不是直接關(guān)聯(lián)在view上的, 因此它們的輸入事件會(huì)先到達(dá)contorller端, 然后由controller去修改model, model再通知view更新數(shù)據(jù)(view更新時(shí)會(huì)從Model取數(shù)據(jù))

(2) Modern MVC

這是現(xiàn)在大家對(duì)MVC模式的理解,和上面的original MVC類似, 只不過(guò)鼠標(biāo)鍵盤事件的輸入源轉(zhuǎn)成了View, 這也符合大家對(duì)窗口理解

(3) MVP

MVP模式割斷了Model和View端的直接通訊,讓Controller(Presenter)當(dāng)作中介者,View接收到鼠標(biāo)鍵盤事件后通過(guò)event通知controller, controller把新數(shù)據(jù)更新到model, model數(shù)據(jù)更改后通知訂閱它事件的controller, controller再把新數(shù)據(jù)更新到view端

(4) Dialog MVP

這種方式是簡(jiǎn)化版的MVP, 把View和Controller寫在一個(gè)dialog里面,雖然UI和邏輯寫在了一起,但是使用起來(lái)很簡(jiǎn)單。

(5) MVVM

MVVM (Model-View-ViewModel) 是MVP的改進(jìn),它講Presenter改成了支持?jǐn)?shù)據(jù)綁定的ViewModel, 這是WPF特有的一種數(shù)據(jù)模型,依賴語(yǔ)言和庫(kù)對(duì)數(shù)據(jù)綁定的支持。

通過(guò)觀察,我們發(fā)現(xiàn)上面無(wú)論那種模型,都有幾個(gè)基本概念:
a. View, 展示界面
b. Controller, 控制邏輯
c. Model, 廣域的model指的是領(lǐng)域建模的業(yè)務(wù)模型層,因?yàn)槲覀冞@里已經(jīng)將業(yè)務(wù)模型封裝在了Framework(SDK)及其下層, 所以我們這里的model主要指的是UI層的一些數(shù)據(jù)模型。

我們發(fā)現(xiàn)每個(gè)view都有一個(gè)controller來(lái)控制它, 但是很多時(shí)候一個(gè)feature我們需要協(xié)調(diào)多個(gè)controller/view, 比如IM里收到一條消息, 你可能既要在消息窗口中顯示, 同時(shí)也要在右下角像QQ那樣出個(gè)提示, 另外可能還需要播放提示音, 這么多事情需要有人來(lái)協(xié)調(diào), 所以我們需要引入Manager的概念, Manager以feature/模塊為劃分單位。

另外有些view可能會(huì)很復(fù)雜, 所以需要引入sub-view的概念, 也就是說(shuō)一個(gè)復(fù)雜的view可能是一顆樹(shù), 它由很多sub-view和, 甚至grandchild-view組成, 同時(shí)每個(gè)view/child-view/grandchild-view都有自己的controller來(lái)處理它的事件。

另外一個(gè)view是由多個(gè)控件元素(Element Control)組成,很多時(shí)候我們需要對(duì)控件元素進(jìn)行定制, 我想這是大家知道的一個(gè)常識(shí)。

UI層基本的結(jié)構(gòu)大概如下:


另外有些時(shí)候我們需要在Manager, Controller和Data Model之間進(jìn)行一些事件廣播, 因此我們需要引入消息中心(message center)的概念。

這樣最終的層次結(jié)構(gòu)圖大概類似這樣:

我們看下各層的訪問(wèn)規(guī)則:
UI Eelement Control, 是界面的基本組成元素, 它的事件會(huì)通知到自己的view (Windows/Panel);
UI View, 可以完全控制自己的Element control, 它收到控件事件后會(huì)通知到自己的 UI Controller;
UI Controller, 可以完全控制自己的UI View, 并且響應(yīng)UI View的事件消息, UI Controller可以調(diào)用自己的UI Data model存儲(chǔ)數(shù)據(jù), 也可以調(diào)用某個(gè)UI Manager的接口處理事件;
UI Manager, 和底層Framework/SDK打交道,可以完全控制controller, 也可以通過(guò)message center廣播重大事件;

我們可以看到, Manager->Controller->View->Eelement, 我們逐層都是基于類完全訪問(wèn), 反之則是基于接口事件消息, 這也符合設(shè)計(jì)中的單向依賴原則。

另外我們?cè)僬f(shuō)下UI Data Model的設(shè)計(jì), UI Data Model實(shí)際上分成public和private兩種類型, 其中public的數(shù)據(jù)是共享的, 可能是多個(gè)controller/manager都要訪問(wèn)的, private則是某個(gè)controller私有的數(shù)據(jù)。

這樣整個(gè)UI層的層次結(jié)構(gòu)就很清楚了:
首先有個(gè)總的UI Manager, 它下面包含三種角色: UI Manager Manager, UI Controller Manager, UI Data Manager。
(1)UI Manager Manager根據(jù)feature/模塊分成多個(gè)子UI Manager, 子UI Manager根據(jù)需要也可以包含自己的子UI Manager;
(2)UI Controller Manager根據(jù)窗口數(shù)量管理多個(gè)窗口的UI Controller, 其中復(fù)雜窗口的UI Controller可能包含樹(shù)狀的子UI Controller;
(3)UI Data Manager根據(jù)數(shù)據(jù)類型,管理多個(gè)public/Share 的UI Data Model; private的UI Data Model是每個(gè)Controller私有的,外面沒(méi)法直接訪問(wèn),由它的controller暴露接口訪問(wèn)。


另外對(duì)于復(fù)雜的UI, 我們可能還需要引入U(xiǎn)I Layout Manager的角色, 因?yàn)閺?fù)雜UI在不同的情況下整個(gè)UI layout會(huì)有巨大改變, 比如會(huì)議系統(tǒng)中共享桌面時(shí)你可能需要把整個(gè)主窗口隱藏,在單屏和雙屏?xí)r整個(gè)UI又完全不一樣, 所以我們需要借助UI Layout Manager協(xié)調(diào)多個(gè)窗口的顯示和隱藏。

最后我們總結(jié)下上面這種架構(gòu)設(shè)計(jì)的優(yōu)勢(shì):
(1) 界面和邏輯的分離, view和controller可以由不同的人分別實(shí)現(xiàn), 獨(dú)立變動(dòng)
(2) 基于接口分層設(shè)計(jì), 單向依賴且低耦合
(3) UI層數(shù)據(jù)類型的分類,共有共享的還是私有的
(4) 消息中心,同時(shí)支持同步/異步的消息廣播機(jī)制, Manager/Controller/Data Model可以各自訂閱自己感興趣的消息
(5)每個(gè)Manager主要關(guān)注自己的那塊feature, 單一職責(zé)
posted on 2018-05-19 19:50 Richard Wei 閱讀(3782) 評(píng)論(1)  編輯 收藏 引用 所屬分類: C++架構(gòu)體系

FeedBack:
# re: 客戶端UI層設(shè)計(jì)的思考
2018-06-11 13:57 | molasses
學(xué)習(xí)了。  回復(fù)  更多評(píng)論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲香蕉伊综合在人在线视看| 欧美在线三区| 日韩午夜视频在线观看| 欧美午夜宅男影院| 欧美日韩精品免费观看视一区二区 | 久久久噜噜噜久久人人看| 亚洲国产精彩中文乱码av在线播放| 欧美午夜无遮挡| 欧美性猛交99久久久久99按摩| 麻豆精品视频在线观看| 久久躁日日躁aaaaxxxx| 久久一区欧美| 毛片一区二区| 久久精品中文字幕一区| 亚洲欧美网站| 欧美一区二区高清在线观看| 亚洲永久在线| 久久精品午夜| 亚洲第一福利视频| 欧美激情一区在线| 亚洲一区制服诱惑| 久久久.com| 欧美精品在线一区二区| 欧美天天影院| 国一区二区在线观看| 亚洲国产精品一区二区www| 亚洲精品久久久久久一区二区| 亚洲桃花岛网站| 久久久天天操| 9人人澡人人爽人人精品| 久久精品官网| 亚洲国产电影| 国产精品久久久久久妇女6080| 香港久久久电影| 亚洲日本va午夜在线电影| 99精品欧美一区二区三区| 午夜电影亚洲| 欧美午夜不卡视频| 亚洲人成网站影音先锋播放| 欧美在线观看网站| 亚洲麻豆av| 欧美成人午夜| 亚洲精品国产精品久久清纯直播| 久久精品视频网| 午夜视黄欧洲亚洲| 国产偷久久久精品专区| 亚洲综合精品一区二区| 国际精品欧美精品| 午夜精品亚洲一区二区三区嫩草| 亚洲国产精品高清久久久| 久久精品国产第一区二区三区| 欧美日韩一区二区在线| 日韩一区二区精品| 亚洲乱码精品一二三四区日韩在线| 先锋影音国产一区| 国产午夜精品理论片a级大结局 | 国产一区二区三区丝袜| 久久久蜜桃精品| 久久久水蜜桃| 一区二区三区**美女毛片| 亚洲成人资源| 国产女精品视频网站免费| 久久视频精品在线| 欧美精品一区二区三区很污很色的| 亚洲在线一区| 欧美激情成人在线| 久久中文精品| 国产精品进线69影院| 久久婷婷丁香| 国产一区二区三区久久精品| 女仆av观看一区| 国产精品日韩精品欧美在线| 乱人伦精品视频在线观看| 欧美丝袜一区二区三区| 亚洲欧洲久久| 亚洲电影中文字幕| 西西人体一区二区| 亚洲欧美在线免费| 欧美午夜片欧美片在线观看| 国产亚洲一本大道中文在线| 日韩午夜免费视频| 一区二区欧美精品| 欧美精品成人91久久久久久久| 久久久综合网站| 国产午夜精品一区理论片飘花| 亚洲制服欧美中文字幕中文字幕| 亚洲国产另类久久久精品极度| 亚洲视频在线看| 亚洲欧美在线一区二区| 国产区精品在线观看| 香蕉成人啪国产精品视频综合网| 性欧美精品高清| 国产在线高清精品| 久久―日本道色综合久久| 老司机精品视频一区二区三区| 国产欧美精品日韩精品| 久久综合色影院| 亚洲日本欧美在线| 午夜在线观看欧美| 在线观看中文字幕亚洲| 老巨人导航500精品| 亚洲视频第一页| 蜜臀va亚洲va欧美va天堂 | 麻豆久久精品| 亚洲国产女人aaa毛片在线| 欧美极品在线观看| 欧美一区二区三区免费观看视频| 亚洲高清在线| 欧美在线一区二区三区| 99pao成人国产永久免费视频| 国产精品自拍网站| 欧美日韩不卡一区| 蜜臀99久久精品久久久久久软件| 亚洲综合精品| 亚洲制服av| 亚洲精品一区二区三区99| 国产精品进线69影院| 亚洲性感美女99在线| 亚洲国产成人91精品| 国产久一道中文一区| 欧美视频一区二区三区| 老司机凹凸av亚洲导航| 久久精品国产一区二区电影| 亚洲综合日韩| 亚洲资源av| 亚洲午夜一级| 午夜在线电影亚洲一区| 亚洲欧美久久| 欧美在线播放一区| 久久久久99| 欧美日本精品| 欧美午夜国产| 欧美jizz19hd性欧美| 免费成人小视频| 亚洲人成高清| 一本色道久久99精品综合| 中文久久乱码一区二区| 亚洲欧美国产不卡| 噜噜噜91成人网| 欧美色一级片| 亚洲国产精品电影| 性欧美xxxx视频在线观看| 裸体一区二区| 亚洲一区二区三区四区五区黄 | 久久成人精品电影| 亚洲高清不卡一区| 午夜视频久久久| 欧美日韩国产精品专区| 激情六月婷婷久久| 一区二区三区视频在线播放| 久久久久88色偷偷免费| 夜夜嗨网站十八久久| 欧美激情一区二区三区在线| 香蕉久久国产| 欧美精品一区二区三| 极品av少妇一区二区| 欧美一级精品大片| 中文欧美字幕免费| 国产精品福利影院| 亚洲欧美www| 亚洲一区精品电影| 国产精品久久福利| 午夜视频在线观看一区二区三区| 91久久国产综合久久| 欧美大片18| 亚洲视频一起| 亚洲欧美成人网| 国产三级欧美三级日产三级99| 亚洲欧美日韩区| 久久久久久网| 日韩视频不卡中文| 亚洲一区二区三区国产| 国产欧美精品va在线观看| 免费在线播放第一区高清av| 亚洲国内自拍| 亚洲激情婷婷| 国产精品久久久久一区二区三区共| 亚洲视频1区| 久久国产主播精品| 亚洲作爱视频| 久久九九免费视频| 中文精品一区二区三区 | 在线日韩av片| 久久国产精品久久久久久电车| 欧美性理论片在线观看片免费| 亚洲视频播放| 久久全球大尺度高清视频| 欧美色中文字幕| 欧美激情小视频| 国产精品福利久久久| 欧美国产视频一区二区| 国产亚洲制服色| 亚洲专区一二三| 亚洲一区在线观看视频| 欧美大片va欧美在线播放| 欧美成人午夜激情视频| 一区久久精品| 翔田千里一区二区| 欧美激情一区二区三区全黄 | 一本色道**综合亚洲精品蜜桃冫|