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

好久沒寫博客,轉管理后技術有些荒廢, 貌似現在流行知乎live和微信公眾號, 博客已經有些過時了,但關鍵是你對技術的思考和總結, 采用什么方式其實不重要。

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


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

上面問題(2)(3)(4)都是和具體平臺系統相關的,這里我們重點關注如何解決問題(1), 也就是如何通過合理的設計降低UI層的復雜性, 因為UI層的代碼往往寫到最后變成了"一坨屎"。

其實UI層的設計已經有很多成熟的模式,我們依次看下:

(1) Original MVC

這是最早的的MVC模式, 據說最早的計算機鼠標鍵盤不是直接關聯在view上的, 因此它們的輸入事件會先到達contorller端, 然后由controller去修改model, model再通知view更新數據(view更新時會從Model取數據)

(2) Modern MVC

這是現在大家對MVC模式的理解,和上面的original MVC類似, 只不過鼠標鍵盤事件的輸入源轉成了View, 這也符合大家對窗口理解

(3) MVP

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

(4) Dialog MVP

這種方式是簡化版的MVP, 把View和Controller寫在一個dialog里面,雖然UI和邏輯寫在了一起,但是使用起來很簡單。

(5) MVVM

MVVM (Model-View-ViewModel) 是MVP的改進,它講Presenter改成了支持數據綁定的ViewModel, 這是WPF特有的一種數據模型,依賴語言和庫對數據綁定的支持。

通過觀察,我們發現上面無論那種模型,都有幾個基本概念:
a. View, 展示界面
b. Controller, 控制邏輯
c. Model, 廣域的model指的是領域建模的業務模型層,因為我們這里已經將業務模型封裝在了Framework(SDK)及其下層, 所以我們這里的model主要指的是UI層的一些數據模型。

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

另外有些view可能會很復雜, 所以需要引入sub-view的概念, 也就是說一個復雜的view可能是一顆樹, 它由很多sub-view和, 甚至grandchild-view組成, 同時每個view/child-view/grandchild-view都有自己的controller來處理它的事件。

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

UI層基本的結構大概如下:


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

這樣最終的層次結構圖大概類似這樣:

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

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

另外我們再說下UI Data Model的設計, UI Data Model實際上分成public和private兩種類型, 其中public的數據是共享的, 可能是多個controller/manager都要訪問的, private則是某個controller私有的數據。

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


另外對于復雜的UI, 我們可能還需要引入UI Layout Manager的角色, 因為復雜UI在不同的情況下整個UI layout會有巨大改變, 比如會議系統中共享桌面時你可能需要把整個主窗口隱藏,在單屏和雙屏時整個UI又完全不一樣, 所以我們需要借助UI Layout Manager協調多個窗口的顯示和隱藏。

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

FeedBack:
# re: 客戶端UI層設計的思考
2018-06-11 13:57 | molasses
學習了。  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品成人播放| 国产一区二区三区不卡在线观看| 亚洲欧洲午夜| 亚洲激情在线观看| 欧美国内亚洲| 国产精品99久久久久久有的能看| 亚洲精品网站在线播放gif| 欧美激情一二区| 亚洲视频精选| 亚洲欧美一区二区三区在线| 国产区亚洲区欧美区| 久久久欧美精品sm网站| 久久精品日产第一区二区| 有码中文亚洲精品| 亚洲精品视频在线播放| 国产精品婷婷| 欧美电影在线| 国产精品国产三级国产aⅴ浪潮| 欧美一区高清| 欧美二区不卡| 欧美一区二区免费| 免费观看日韩| 香蕉久久夜色| 欧美高清视频一区二区三区在线观看| 一区二区三区久久网| 午夜久久久久| aⅴ色国产欧美| 欧美亚洲免费电影| 亚洲精品在线电影| 欧美亚洲免费高清在线观看| 亚洲精品综合| 久久激情五月婷婷| 亚洲图片欧美午夜| 老司机免费视频一区二区| 亚洲欧美另类国产| 欧美刺激性大交免费视频| 午夜精品短视频| 欧美精品日韩一本| 老牛嫩草一区二区三区日本| 欧美三级电影一区| 亚洲高清资源| 伊人蜜桃色噜噜激情综合| 亚洲午夜一区| 亚洲视频欧美视频| 美日韩精品视频| 久久久久9999亚洲精品| 国产精品人人爽人人做我的可爱| 欧美激情久久久久久| 国产亚洲美州欧州综合国| 一区二区三区福利| 99精品视频一区| 免费亚洲一区二区| 免费欧美视频| 一区二区视频在线观看| 欧美一区二区精品久久911| 亚洲欧美日韩精品| 国产精品国产三级国产aⅴ浪潮 | 亚洲综合日韩在线| 欧美激情精品久久久久久| 欧美ed2k| 亚洲国产精品久久久久秋霞不卡 | 欧美日韩国产高清视频| 亚洲国产成人在线播放| 亚洲高清不卡一区| 久久久水蜜桃| 欧美大片在线看| 亚洲国产精品欧美一二99| 玖玖国产精品视频| 亚洲高清三级视频| 亚洲精品视频在线播放| 欧美xart系列高清| 亚洲精品自在久久| 一区二区三区导航| 欧美日韩一区二区三区高清| 中文av一区二区| 欧美一区二区性| 国产亚洲人成a一在线v站| 欧美中文在线免费| 美女在线一区二区| 亚洲人体1000| 欧美色图天堂网| 午夜免费日韩视频| 狂野欧美激情性xxxx| 亚洲精品男同| 国产精品久久久一区二区三区| 午夜精品久久99蜜桃的功能介绍| 久久久亚洲国产天美传媒修理工 | 国产一区二区日韩| 久久精品一区| 亚洲精品一区二区三区99| 亚洲欧美综合v| 国精品一区二区三区| 蜜臀99久久精品久久久久久软件| 亚洲人成人77777线观看| 亚洲在线观看免费视频| 黄色成人免费网站| 欧美精品一区二区三区视频| 亚洲一区综合| 亚洲成色www8888| 亚洲愉拍自拍另类高清精品| 久久av红桃一区二区小说| 极品av少妇一区二区| 欧美劲爆第一页| 午夜精品久久久久久久久久久| 欧美高清在线视频观看不卡| 亚洲综合成人在线| 亚洲国产mv| 国产精品亚洲精品| 欧美国产欧美亚洲国产日韩mv天天看完整 | 性欧美xxxx大乳国产app| 狠狠色狠狠色综合日日91app| 欧美高清影院| 久久国产精品久久久| 日韩一二三区视频| 欧美wwwwww| 欧美一级艳片视频免费观看| 亚洲欧洲偷拍精品| 国产一区二区三区四区在线观看 | 久久久久看片| 亚洲——在线| 99在线精品视频| 亚洲第一精品久久忘忧草社区| 香蕉久久国产| 亚洲视频 欧洲视频| 亚洲韩国一区二区三区| 国产夜色精品一区二区av| 欧美日韩中文字幕在线| 久久综合999| 欧美一区二区高清| 亚洲午夜视频在线观看| 亚洲清纯自拍| 亚洲高清在线观看一区| 欧美jizz19hd性欧美| 久久精品二区三区| 翔田千里一区二区| 亚洲一区在线观看视频| 在线视频免费在线观看一区二区| 亚洲国产精品一区二区www在线| 激情综合色综合久久| 国产视频观看一区| 国产欧美一区二区精品婷婷| 国产精品一区二区女厕厕| 国产精品青草综合久久久久99| 欧美午夜精品一区| 欧美午夜激情小视频| 欧美日韩中文字幕| 国产精品久久久亚洲一区| 欧美性一二三区| 国产精品麻豆va在线播放| 国产精品久久久久一区| 国产精品夜夜夜一区二区三区尤| 国产精品美女久久久久av超清 | 欧美精品久久一区二区| 欧美成年人在线观看| 欧美成人免费全部| 欧美日韩www| 国产精品久久999| 国产人成一区二区三区影院| 国外视频精品毛片| 在线观看视频亚洲| 亚洲日本一区二区三区| 亚洲视频一区二区免费在线观看| 亚洲午夜久久久久久久久电影院| 亚洲午夜激情网站| 久久成人免费电影| 噜噜噜噜噜久久久久久91 | 欧美激情精品久久久久| 亚洲精品在线视频观看| 亚洲午夜精品久久久久久浪潮| 欧美一区午夜精品| 母乳一区在线观看| 欧美调教视频| 黑人中文字幕一区二区三区| 99av国产精品欲麻豆| 欧美在线观看视频在线| 欧美电影在线观看完整版| 亚洲精品中文字幕在线| 欧美亚洲综合久久| 欧美激情五月| 国产网站欧美日韩免费精品在线观看| 亚洲国产精品欧美一二99| 亚洲淫性视频| 欧美大片在线观看一区| 亚洲一区二区三区高清| 麻豆成人精品| 国产精品一区二区久久久| 亚洲欧洲一区二区在线播放| 午夜久久黄色| 亚洲人成亚洲人成在线观看| 欧美影视一区| 欧美特黄一级大片| 亚洲人成欧美中文字幕| 久久久久久久综合| 亚洲美洲欧洲综合国产一区| 久久久999| 国产女人精品视频| 中国日韩欧美久久久久久久久| 麻豆国产精品777777在线| 亚洲欧美成人在线| 欧美日韩国产一中文字不卡 |