久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

簡單的MVP框架搭建

 EugeneYuan 2023-08-31 發(fā)布于北京

1.MVP框架介紹:

最近公司內(nèi)部培訓(xùn),,正好理一下項目的架構(gòu),目前最主要的產(chǎn)品還是用的MVP軟件設(shè)計模式,,就順便查查資料來做個總結(jié),。

1.1什么是MVP?

MVP是Model-View—Presenter的縮寫,,從網(wǎng)上找到的資料來看,,大多數(shù)時候,對于MVP的介紹還是基于MVC,,關(guān)注點基本上就集中在Presenter上面了,wiki上有個簡單的說明(MVP模式),,先從定義來大概理解下這個模式:

1.2MVP各自的使用規(guī)則和相互的交互

這三個模塊,,一般情況下,對于view的理解是沒什么爭議的,,就是界面展示,;關(guān)于Model和Presenter的功能,還是有些爭議,,簡單的來說,,一個是業(yè)務(wù)邏輯,一個是界面控制邏輯,,但是實際定義的時候可能就沒那么清楚了,,關(guān)于這兩個模塊定位的區(qū)分,我看到了一篇比較有用的文章,,雖然是MVC的,,但是原理是差不多的(點這里查看原文):

復(fù)制代碼

復(fù)制代碼

實體對象(entity object):        通常是來自域模型中的對象(也就是現(xiàn)實世界),它常對應(yīng)于數(shù)據(jù)庫表和文件,,這些數(shù)據(jù)表    和文件中存儲了執(zhí)行用例所需的數(shù)據(jù),。有些實體對象是“臨時”對象(如搜索結(jié)果),,當(dāng)用例    結(jié)束后將消失。    邊界對象(boundary object):        參與者使用它來同系統(tǒng)交互,,這通常包含窗口,,屏幕,,對話框和菜單。如果有GUI原型,,    將會知道許多主要的邊界對象是什么。    控制對象(control object):        將邊界對象和實體對象關(guān)聯(lián)起來(通常被稱為控制器,因為它們通常不是真正的對象),,    它包含了大部分應(yīng)用邏輯,,它們在用戶和存儲的數(shù)據(jù)之間架起一座橋梁??刂茖ο笾邪?jīng)常    修改的業(yè)務(wù)規(guī)則和策略,。這樣修改只需要在這些對象中進行,,而不會涉及到用戶界面和數(shù)據(jù)庫    模式,??刂破髋紶?nbsp;(20%的時間內(nèi))也會是設(shè)計中的“真正對象”,但大部分時間內(nèi),控制器只    是一個占位符,,用于避免您遺漏用例要求的任何功能和系統(tǒng)行為,。

復(fù)制代碼

復(fù)制代碼

關(guān)于這三個模塊的交互,,可以用一張圖來體現(xiàn):

Presenter做為Model和View的中間層,維護頁面操作狀態(tài),,從Model獲取數(shù)據(jù),,百度百科里用的圖Presenter和model之間是雙向綁定的,,有點沒看懂,,原則上,,Model是不會處理Presenter的,。

1.3關(guān)于MVP的一些概念上的問題     

我之前對于Model的理解是有些誤差的,,不管是MVC還是MVP,,我之前以為Model是數(shù)據(jù)模型,,只是數(shù)據(jù)庫交互的相關(guān)操作,這本身應(yīng)該算是對Model的一種弱化,實際上,,參考微軟提供的MVCScore的示例項目(下載鏈接)可以發(fā)現(xiàn),,Model并不是通常意義上跟數(shù)據(jù)庫中表的對應(yīng),,對應(yīng)的其實是后臺的Service這部分,,Model作為業(yè)務(wù)邏輯模型,應(yīng)該承擔(dān)更多業(yè)務(wù)處理工作,這樣才是把業(yè)務(wù)和頁面展示分開,,實現(xiàn)前臺頁面和后臺邏輯的解耦,。

當(dāng)然,,軟件設(shè)計模式不是標(biāo)準(zhǔn),只是一個解決特定方案的相對合理化方案而已,解耦也不是軟件設(shè)計的唯一標(biāo)準(zhǔn),,甚至不是最重要的標(biāo)準(zhǔn),。

1.4MVP模式的一般實現(xiàn)方式

目前我的項目中的實現(xiàn)方式是用接口來連接view和Presenter,根據(jù)定義好的接口來進行分塊開發(fā),,如下圖:

接下來是做一個小的demo來實際明確一下各部分的功能:

2.MVP的demo

2.1這個demo的具體使用場景和簡單設(shè)計

我還是想把這個demo做成一個持續(xù)優(yōu)化的項目,,對于一個正式一點的項目,登錄頁面一般都是網(wǎng)站的第一步,,這個demo就先做一個登錄頁面,,暫時不考慮數(shù)據(jù)交互,MVP都定義最簡單的形式,,獲取角色,,輸入用戶名密碼,登錄,。

2.2詳細設(shè)計

分模塊定義:

2.2.1 數(shù)據(jù)實體類項目(Data):添加角色類和用戶信息類

2.2.2 數(shù)據(jù)業(yè)務(wù)邏輯模型項目(Model):添加一個登錄驗證類,,添加獲取角色信息和用戶登錄兩個方法

2.2.3 界面業(yè)務(wù)邏輯操作項目(Presenter):這里有兩部分的內(nèi)容:1.接口定義;2.頁面處理邏輯,。通過定義委托和接口中的屬性來控制頁面上的事件和數(shù)據(jù),。

以前一直以為Model包括Data和Dao,所以一直不理解,,為什么說Model和View沒有通訊,,實體類肯定是貫穿整個解決方案的,view就不說了,?!      ?/p>

2.3各個部分的實現(xiàn)

Data項目:  

public class RoleInfo     {         public string RoleName { get; set; }         public string RoleID { get; set; }     }

復(fù)制代碼

public class UserInfo     {         public string RoleID { get; set; }         public string UserName { get; set; }         public string Password { get; set; }     }

復(fù)制代碼

Model項目:

復(fù)制代碼

/// 

/// 權(quán)限管理     ///     public class Authority     {         ///         /// 初始化方法         ///         public IList GetRoleList()         {             IList roleList = new List();             roleList.Add(new RoleInfo() { RoleName = '管理員', RoleID = '1' });             roleList.Add(new RoleInfo() { RoleName = '操作員', RoleID = '2' });             roleList.Add(new RoleInfo() { RoleName = '一般用戶', RoleID = '3' });             roleList.Add(new RoleInfo() { RoleName = 'VIP用戶', RoleID = '4' });             return roleList;         }         public bool Login(string userName, string password)         {             return true;         }     }

復(fù)制代碼

Presenter項目:  

復(fù)制代碼

public delegate bool LoginEvnet(string userName,string password);     /// 

/// 登錄窗口需要實現(xiàn)的接口     ///     public interface ILoginView     {         IList RoleList { set; }     }

復(fù)制代碼

復(fù)制代碼

/// 

/// 權(quán)限管理     ///     public class LoginPresenter     {         private ILoginView _view;         private Model.Authority authority;           public LoginPresenter(ILoginView view)         {             _view = view;             authority = new Model.Authority();         }         ///         /// 登錄方法         ///         /// /// ///         public bool Login(string userName,string password)         {             return authority.Login(userName,password);         }         ///         /// 初始化方法         ///         public void Init()         {              _view.RoleList = authority.GetRoleList();         }     }

復(fù)制代碼

頁面后臺代碼,負(fù)責(zé)綁定事件和更新頁面控件屬性:

復(fù)制代碼

public partial class LoginView : System.Web.UI.Page, ILoginView     {         private LoginPresenter presenter;         protected void Page_Load(object sender, EventArgs e)         {             presenter = new LoginPresenter(this);             presenter.Init();             btnLogin.Click += delegate {                     if (presenter.Login(txtUserName.Value, txtPassword.Value))                     {                         //登錄成功                         this.ClientScript.RegisterStartupScript(typeof(string), 'js', 'alert('登錄成功,!');', true);                     }                     else                     {                         this.ClientScript.RegisterStartupScript(typeof(string), 'js', 'alert('登錄失?。?#39;);', true);                     }                 };         }         public IList RoleList         {             set              {                 foreach (RoleInfo text in value)                 {                     ListItem item = new ListItem();                     item.Text = text.RoleName;                     item.Value = text.RoleID;                     ddlRole.Items.Add(item);                 }                             }         }     }

復(fù)制代碼

最后說一點,,這周公司內(nèi)部培訓(xùn),,接觸了下struts2的框架,相比之下,,突然覺得MVP只是一個概念,,實際上用的時候并沒有真正用到任何所謂的框架,MVP夾在MVC和MVVM之間感覺定位也是有點尷尬,,就我目前的理解來說,,MVP是一種關(guān)注代碼分離的設(shè)計思想,還是不如MVVM分離的干凈,。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多