淺談開發中的MVVM模式及與MVP和MVC的區別

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

640?wx_fmt=png&wxfrom=5&wx_lazy=1

我記得前段時間分享了一篇文章《?淺談Andorid開發中的MVP模式》(點擊可跳轉),反響不錯,為了進一步介紹MVVM模式,還提前分享了實現Android中MVVM模式的一個關鍵技術的文章《Android 數據綁定框架DataBinding,堪稱解決界面邏輯的黑科技》(點擊可跳轉) 。如果沒有看過這兩篇文章的,建議先看看這兩篇文章,再看下面的分享。

?

什么是MVVM?

?

MVVM是Model-View-ViewModel的簡寫。微軟的WPF帶來了新的技術體驗,如Silverlight、音頻、視頻、3D、動畫……,這導致了軟件UI層更加細節化、可定制化。同時,在技術層面,WPF也帶來了 諸如Binding、Dependency Property、Routed Events、Command、DataTemplate、ControlTemplate等新特性。MVVM(Model-View-ViewModel)框架的由來便是MVP(Model-View-Presenter)模式與WPF結合的應用方式時發展演變過來的一種新型架構框架。它立足于原有MVP框架并且把WPF的新特性糅合進去,以應對客戶日益復雜的需求變化。

?

MVC和MVP,MVVM之間的關系

?

MVC和MVP的關系

我們都知道MVP是從經典的模式MVC演變而來,它們的基本思想有相通的地方:Controller/Presenter負責邏輯的處理,Model提供數 據,View負責顯示。作為一種新的模式,MVP與MVC有著一個重大的區別:在MVP中View并不直接使用Model,它們之間的通信是通過 Presenter (MVC中的Controller)來進行的,所有的交互都發生在Presenter內部,而在MVC中View會直接從Model中讀取數據而不是通過 Controller。

?

MVVM和MVP的關系

而 MVVM 模式將 Presenter 改名為 ViewModel,基本上與 MVP 模式完全一致。 唯一的區別是,它采用雙向綁定(data-binding):View的變動,自動反映在 ViewModel,反之亦然。這樣開發者就不用處理接收事件和View更新的工作,框架已經幫你做好了。

?

視圖化解釋關系

?

MVC架構:

View:對應于布局文件

Model:業務邏輯和實體模型

Controllor:對應于Activity

204750_cybe_1771562.gif

  • View可以與Model直接交互。

  • Controller是基于行為的,并且可以被多個View共享。

  • 可以負責決定顯示哪個View。
    ?

MVP架構:

View: 對應于Activity,負責View的繪制以及與用戶交互
Model: 依然是業務邏輯和實體模型
Presenter: 負責完成View于Model間的交互

204750_BjoR_1771562.gif

  • View不直接與Model交互,而是通過與Presenter交互來與Model間接交互。

  • Presenter與View的交互是通過接口來進行的。

  • 通常View與Presenter是一對一的,但復雜的View可能綁定多個Presenter來處理邏輯。

    ?

MVVM架構:

Model:代表你的基本業務邏輯

View:顯示內容

ViewModel:將前面兩者聯系在一起的對象

204750_foWk_1771562.gif

一個ViewModel接口提供了兩個東西:動作和數據。動作改變Model的下層(click listener,監聽文字改變的listener等等),而數據則是Model的內容。

?

去年的I/O大會上谷歌介紹了一個非常好用的新框架DataBinding,該框架可以讓你將view和一個對象的對field綁定。當field更新的時候,framework將收到通知,同時view也會自動更新。其語法和使用方式和 JSP 中的 EL 表達式非常類似。

?

在MVVM中,ViewModel在改變內容之后通知binding framework內容發生了改變。然后framework自動更新和那些內容綁定的view。這兩個組件只是通過ViewModel松耦合在一起。這種設計模式之所以好用和方便,除了明顯智能化了的View之外,還方便了測試。因為ViewModel不在依賴于View了,你可以在沒有View的情況下也能測試ViewModel。在合適的依賴注入的幫助下,測試就會變得非常簡單。

?

MVVM的優點

?

1. 低耦合。視圖(View)可以獨立于Model變化和修改,一個ViewModel可以綁定到不同的"View"上,當View變化的時候Model可以不變,當Model變化的時候View也可以不變。

?

2. 可重用性。你可以把一些視圖邏輯放在一個ViewModel里面,讓很多view重用這段視圖邏輯。

?

3. 獨立開發。開發人員可以專注于業務邏輯和數據的開發(ViewModel),設計人員可以專注于頁面設計。

?

4. 可測試。界面素來是比較難于測試的,而現在測試可以針對ViewModel來寫。

?

具體怎么好用,怎么使用,建議參考我寫的《Android 數據綁定框架DataBinding,堪稱解決界面邏輯的黑科技》這篇文章。

?

參考文章:

《?淺談Andorid開發中的MVP模式》(點擊可跳轉)

Android 數據綁定框架DataBinding,堪稱解決界面邏輯的黑科技》(點擊可跳轉)

轉載于:https://my.oschina.net/JiangTun/blog/910901

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/456375.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/456375.shtml
英文地址,請注明出處:http://en.pswp.cn/news/456375.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Azkaban簡介及安裝教程

前言: 最近在實際工作中玩到了Azkaban,雖然之前有簡單的接觸,但是真正用到的時候,才能體會到這個工具的實用性有多強。下面就寫個系列文章來記錄下azkaban從簡介及安裝配置再到簡單使用的一個過程。 1、概述 1.1、為什么需要工…

面向對象:實例化的對象調用類方法 db.Column()

請問 類的對象調用另一個類的對象 是什么意思??? from flask_sqlalchemy import SQLAlchemydb SQLAlchemy()class User(db.Model):__tablename__ usersid db.Column(db.Integer, primary_keyTrue)username db.Column(db.String…

WatiN-Html元素的操作

自動化測試,何為自動化測試,簡單點說就是機器代替人工操作,那么WatiN實現Web應用在瀏覽器上的自動化就需要模擬人工點擊、輸入、選擇、拖放等等操作,在這些操作中會觸Html元素的onclick、onchange、onmousemove等事件。在WatiN中提…

azkaban的操作指南

前言: 最近在實際工作中玩到了Azkaban,雖然之前有簡單的接觸,但是真正用到的時候,才能體會到這個工具的實用性有多強,總結下真個操作過程。在總結整個操作過程之前先簡單描述下工作流調度系統的優勢。 1、工作流調度…

創建對象方法之增

# 1. 創建模型對象 user User() # 2. 給對象賦值 user.username username user.password pwd user.phone phone # 3. 向數據庫提交數據 db.session.add(user) db.sessio…

ActiveMq使用筆記

java JMS技術 .1. 什么是JMS JMS即Java消息服務(Java Message Service)應用程序接口是一個Java平臺中關于面向消息中間件(MOM)的API,用于在兩個應用程序之間,或分布式系統中發送消息,進行異步…

導入Anaconda中的第三方庫運行時報錯:ImportError: Missing required dependencies ['pandas']

今天碰到一個大坑,花了大半天才搞明白問題出在哪來。事情的經過是這樣的:博主下午手賤把已將裝好anaconda2給卸載了(同時裝了2和3),然后再次安裝anconda2后,卻發現配置完pycharm的解釋器后,代碼…

BZOJ2005 NOI2010 能量采集 歐拉函數

題意&#xff1a;求$\sum\limits_{i 1}^N {\sum\limits_{j 1}^M {f(i,j)} } $&#xff0c;其中f(i,j)(0,0)與(i,j)連線上點的數量 題解&#xff1a; 如果一個點(x,y)在(0,0)與(x,y)的連線上&#xff0c;則有gcd(x,y)gcd(x,y)。因此f(i,j)(gcd(i,j)gcd(i,j))且i<i,j<j的…

通過__tablename__ = 'xxx' #定義表名

from datetime import datetimefrom exts import dbclass User(db.Model):__tablename__ user1 #定義表名id db.Column(db.Integer,primary_keyTrue,autoincrementTrue)username db.Column(db.String(10), nullableTrue)password db.Column(db.String(256), nullableTrue)p…

python子類繼承父類特性,pycharm上面已經提示繼承了,為什么會報沒有該特性的錯誤?

因為在子類里覆蓋了父類的__init__ 如果需要調用父類用super class A(object):def __init__(self):self.a 1def fun(self):print self.aclass B(A):def __init__(self):self.b 2super(B, self).__init__()def fun(self):print self.aprint self.bB().fun()

Hadoop偽分布安裝詳解(一)

注&#xff1a;以下截圖針對Ubuntu操作系統&#xff0c;對Centos步驟類似。請讀者選擇不同鏡像即可。 第一部分&#xff1a;VMware WorkStation10 安裝 1.安裝好VMware10虛擬機軟件并下載好Ubuntu16.04 LTS 64位版的鏡像包 2.打開VMware10虛擬機軟件&#xff0c;選擇“創建新的…

C++_const常成員作用

介紹 常成員是什么 1.常成員關鍵詞為&#xff1a;const 2.常成員有&#xff1a;常成員變量、常成員函數、常成員對象 常成員有什么用 1.常成員變量&#xff1a;用于在程序中定義不可修改內部成員變量的函數 2.常成員函數&#xff1a;只能夠訪問成員變量&#xff0c;不可以修改成…

Python開發中收集的一些常用功能Demo

文章目錄目錄&#xff1a;前言&#xff1a;1、Python判斷文件是否存在的幾種方法&#xff1a;1.1、使用os模塊1.2、使用Try語句&#xff08;比較嚴謹的寫法&#xff09;1.3、使用pathlib模塊2、Python中寫入List到文本中并換行的方法3、Python按行讀取文件的幾種簡單實現方法3.…

Unlicensed ARC session – terminating!

問題描述 近日&#xff0c;發現ArcGIS10.4中存在很多bug&#xff0c;而且費了好多時間去測試它&#xff0c;最終決定改用10.1。在降級程序時遇到許可問題。 重裝ArcGIS10.1后&#xff0c;打開工程&#xff0c;所有引用都自動映射&#xff0c;沒報任何錯誤&#xff0c;清理重新生…

SQLAlchemy - Column詳解

SQLAlchemy - Column詳解 Column常用參數&#xff1a; default&#xff1a;默認值 nullable&#xff1a;是否可有 primary_key&#xff1a;是否為主鍵 unique&#xff1a;是否唯一 autoincrement&#xff1a;是否自動增長 onupdate&#xff1a;更新的時候執行的函數 name&…

Linux命令三劍客:grep、sed、awk總結

文章目錄前言一、grep命令語法實例grep結合pattern正則二、sed命令語法案例三、awk命令語法實例前言 最近看到了幾篇關于linux命令grep、sed、awk的文章&#xff0c;這里總結下&#xff0c;方便后面使用。 一、grep grep命令&#xff08;grep的全稱&#xff1a;Global searc…

python 機器學習資料

!(7 Steps to Mastering Machine Learning With Python) [http://www.kdnuggets.com/2015/11/seven-steps-machine-learning-python.html] 轉載于:https://www.cnblogs.com/zk47/p/6448506.html

Flask-SQLAlchemy 中如何不區分大小寫查詢?

例如下面的 User 模型&#xff0c;在數據庫中查詢時并不會區分大小寫 class User(db.Model):__tablename__ usersid db.Column(db.Integer, primary_keyTrue)username db.Column(db.String(64), uniqueTrue, indexTrue)password_hash db.Column(db.String(128)) 這時&…

Git常用指令及功能總結

文章目錄前言&#xff1a;1、常用的git指令2、常用git功能及操作2.1、下載代碼&#xff1a;2.2、當前分支和master保持一致2.3、修改代碼后提交代碼到指定分支2.4、版本回退&#xff08;時空穿梭機&#xff09;2.5、概念工作區和暫存區2.6、添加遠程庫2.7、分支管理2.8、標簽管…

MacOS下MySQL配置

先去官網下載一個 MySQL for mac http://www.cnblogs.com/xiaobo-Linux/ 命令行運行終端&#xff0c;運行下面兩條命令&#xff1a; 12alias mysql/usr/local/mysql/bin/mysqlalias mysqladmin/usr/local/mysql/bin/mysqladmin方便終端直接輸入mysql命令&#xff0c;而不是必須…