




已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1. Visual C#實(shí)現(xiàn)MVC模式簡要方法在我們的開發(fā)項(xiàng)目中使用MVC(Model-View-Control)模式的益處是,可以完全降低業(yè)務(wù)層和應(yīng)用表示層的相互影響。此外,我們會有完全獨(dú)立的對象來操作表示層。MVC在我們項(xiàng)目中提供的這種對象和層之間的獨(dú)立,將使我們的維護(hù)變得更簡單使我們的代碼重用變得很容易(下面你將看到)。作為一般的習(xí)慣,我們知道我們希望保持最低的對象間的依賴,這樣變化能夠很容易的得到滿足,而且我們可以重復(fù)使用我們辛辛苦苦寫的代碼。為了達(dá)到這個目的我們將遵循一般的原則“對接口編成,而不是對類”來使用MVC模式。我們的使命,如果我們選擇接受它 我們被委任構(gòu)建一個ACME 2000 Sports Car項(xiàng)目,我們的任務(wù)是做一個簡單的Windows畫面來顯示汽車的方向和速度,使終端用戶能夠改變方向,加速或是減速。當(dāng)然將會有范圍的擴(kuò)展。在ACME已經(jīng)有了傳言,如果我們的項(xiàng)目成功,我們最終還要為ACME 2 Pickup Truck 和ACME 1 Tricycle開發(fā)一個相似的接口。作為開發(fā)人員,我們也知道ACME管理團(tuán)隊(duì)最終將問“這樣是很棒的,我們能夠在我們的intranet上看到它?”所有的這些浮現(xiàn)在腦海中,我們想交付一個產(chǎn)品,使它能夠容易的升級以便能夠保證將來我們能夠有飯吃。所以,同時我們決定“這是使用MVC的一個絕好情形”我們的構(gòu)架概要現(xiàn)在我們知道我們要使用MVC,我們需要指出它的本質(zhì)。通過我們的試驗(yàn)得出MVC的三個部分:Model,Control和View。在我們的系統(tǒng)中,Model就是我們的汽車,View就是我們的畫面,Control將這兩個部分聯(lián)系起來。為了改變Model(我們的ACME 2000 sports car),我們需要使用Control。我們的Control將會產(chǎn)生給Model(我們的ACME 2000 sports car)的請求,和更新View,View就是我們的畫面(UI)。這看起來很簡單,但是這里產(chǎn)生了第一個要解決的問題:當(dāng)終端用戶想做一個對ACME 2000 sports car一個改變將會發(fā)生什么,比如說加速或是轉(zhuǎn)向?他們將通過View(our windows form)用Control來提出一個變化的申請?,F(xiàn)在我們就剩下一個未解決問題了。如果View沒有必要的信息來顯示Model的狀態(tài)怎么辦?我們需要再在我們的圖中加入一個箭頭:View將能申請Model的狀態(tài)以便得到它要顯示的相關(guān)狀態(tài)信息。最后,我們的最終用戶(司機(jī))將會和我們的ACME Vehicle Control系統(tǒng)通過View來交互。如果他們想發(fā)出一個改變系統(tǒng)的申請,比如提高一點(diǎn)加速度,申請將會從View開始發(fā)出由Control處理。Control將會向Model申請改變并將必要的變化反映在View上。比如,如果一個蠻橫的司機(jī)對ACME 2000 Sports Car做了一個floor it申請,而現(xiàn)在行駛的太快不能轉(zhuǎn)向,那么Control將會拒絕這個申請并在View中通知,這樣就防止了在交通擁擠是發(fā)生悲慘的連環(huán)相撞。Model (the ACME 2000 Sports Car) 將通知View 它的速度已經(jīng)提高,而View也將做適當(dāng)?shù)母?。綜上,這就是我們將構(gòu)建的概要:開始作為總是想的遠(yuǎn)一點(diǎn)的開發(fā)人員,我們想讓我們的系統(tǒng)有一個長久并且良好的生命周期。這就是說能夠進(jìn)可能的準(zhǔn)備好滿足ACME的很多變化。為了做到這一點(diǎn),我們知道要遵循兩條原則“保證你的類低耦合”,要達(dá)到這個目標(biāo),還要“對接口編程”。所以我們要做三個接口(正如你所猜測,一個Model接口,一個View接口,一個Control接口)。 經(jīng)過很多調(diào)查研究,和與ACME人的費(fèi)力咨詢,我們得到了很多有關(guān)詳細(xì)設(shè)計的信息。我們想確定我們可以設(shè)置的最大速度在前進(jìn),后退和轉(zhuǎn)彎中。我們也需要能夠加速,減速,左轉(zhuǎn)和右轉(zhuǎn)。我們的儀表盤必須顯示當(dāng)前的速度和方向。實(shí)現(xiàn)所有這些需求是非??量痰?,但是我們確信我們能夠做到首先,我們考慮一下基本的項(xiàng)目。我們需要一些東西來表示方向和轉(zhuǎn)動請求。我們做了兩個枚舉類型:AbsoluteDirection 和 RelativeDirection。public enum AbsoluteDirectionNorth=0, East, South, Westpublic enum RelativeDirectionRight, Left, Back 下面來解決Control接口。我們知道Control需要將請求傳遞給Model,這些請求包括:Accelerate, Decelerate, 和 Turn。我們建立一個IVehicleControl接口,并加入適當(dāng)?shù)姆椒?。public interface IVehicleControlvoid Accelerate(int paramAmount);void Decelerate(int paramAmount);void Turn(RelativeDirection paramDirection); 現(xiàn)在我們來整理Model接口。我們需要知道汽車的名字,速度,最大速度,最大倒退速度,最大轉(zhuǎn)彎速度和方向。我們也需要加速,減速,轉(zhuǎn)彎的函數(shù)。public interface IVehicleModelstring Name get; set;int Speed get; set;int MaxSpeed get;int MaxTurnSpeed get;int MaxReverseSpeed get;AbsoluteDirection Directionget; set;void Turn(RelativeDirection paramDirection);void Accelerate(int paramAmount);void Decelerate(int paramAmount); 最后,我們來整理View接口。我們知道View需要暴露出Control的一些機(jī)能,比如允許或禁止加速,減速和轉(zhuǎn)彎申請。public interface IVehicleViewvoid DisableAcceleration();void EnableAcceleration();void DisableDeceleration();void EnableDeceleration();void DisableTurning();void EnableTurning(); 現(xiàn)在我們需要做一些微調(diào)使我們的這些接口能夠互相作用。首先,任何一個Control都需要知道它的View和Model,所以在我們的IvehicleControl接口中加入兩個函數(shù):SetModel 和SetView:public interface IVehicleControlvoid RequestAccelerate(int paramAmount);void RequestDecelerate(int paramAmount);void RequestTurn(RelativeDirection paramDirection); void SetModel(IVehicleModel paramAuto);void SetView(IVehicleView paramView); 下一個部分比較巧妙。我們希望View知道Model中的變化。為了達(dá)到這個目的,我們使用觀察者模式。為了實(shí)施觀察者模式,我們需要將下面的函數(shù)加入到Model(被View觀察):AddObserver, RemoveObserver, 和 NotifyObservers。public interface IVehicleModelstring Name get; set;int Speed get; set;int MaxSpeed get;int MaxTurnSpeed get;int MaxReverseSpeed get;AbsoluteDirection Directionget; set;void Turn(RelativeDirection paramDirection);void Accelerate(int paramAmount);void Decelerate(int paramAmount);void AddObserver(IVehicleView paramView);void RemoveObserver(IVehicleView paramView);void NotifyObservers(); 并且將下面的函數(shù)加入到View(被Model觀察)中。這樣做的目的是Model會有一個View的引用。當(dāng)Model發(fā)生變化時,將會調(diào)用NotifyObservers()方法,傳入一個對其自身的引用并調(diào)用Update()通知View這個變化。public class IVehicleViewvoid DisableAcceleration();void EnableAcceleration();void DisableDeceleration();void EnableDeceleration();void DisableTurning();void EnableTurning();void Update(IVehicleModel paramModel); 這樣我們就將我們的接口聯(lián)系起來了。在下面的代碼中我們只需要引用我們這些接口,這樣就保證了我們代碼的低耦合。任何顯示汽車狀態(tài)的用戶界面都需要實(shí)現(xiàn)IVehicleView,我們所有的ACME都需要實(shí)現(xiàn)IVehicleModel,并且我們需要為我們的ACME汽車制作Controls,這些Control將實(shí)現(xiàn)IVehicleControl接口。下一步在common中都需要什么我們知道所有的汽車都做相同的動作,所以我們接下來做一個基于“骨架”的共有的代碼來處理這些操作。這是一個抽象類,因?yàn)槲覀儾幌M魏稳嗽凇肮羌堋鄙祥_車(抽象類是不能被實(shí)例化的)。我們稱其為Automobile。我們將用一個ArrayList (from System.Collections)來保持跟蹤所有感興趣的Views(記住觀察者模式了嗎?)。我們也可以用老式的數(shù)組來記錄對IVehicleView的引用,但是現(xiàn)在我們已經(jīng)很累了想快點(diǎn)結(jié)束這篇文章。如果你感興趣,看一下在觀察者模式中AddObserver, RemoveObserver, 和NotifyObservers,這些函數(shù)是怎樣和IVehicleView互相作用的。任何時間當(dāng)有速度或方向變化時,Automobile通知所有的IVehicleViews。 public abstract class Automobile: IVehicleModelDeclarations #region Declarations private ArrayList aList = new ArrayList();private int mintSpeed = 0;private int mintMaxSpeed = 0;private int mintMaxTurnSpeed = 0;private int mintMaxReverseSpeed = 0;private AbsoluteDirection mDirection = AbsoluteDirection.North;private string mstrName = ;#endregionConstructor#region Constructorpublic Automobile(int paramMaxSpeed, int paramMaxTurnSpeed, int paramMaxReverseSpeed, string paramName)this.mintMaxSpeed = paramMaxSpeed;this.mintMaxTurnSpeed = paramMaxTurnSpeed;this.mintMaxReverseSpeed = paramMaxReverseSpeed;this.mstrName = paramName;#endregionIVehicleModel Members#region IVehicleModel Memberspublic void AddObserver(IVehicleView paramView)aList.Add(paramView);public void RemoveObserver(IVehicleView paramView)aList.Remove(paramView);public void NotifyObservers()foreach(IVehicleView view in aList)view.Update(this);public string Namegetreturn this.mstrName;setthis.mstrName = value;public int Speedgetreturn this.mintSpeed;public int MaxSpeedgetreturn this.mintMaxSpeed;public int MaxTurnSpeedgetreturn this.mintMaxTurnSpeed;public int MaxReverseSpeedgetreturn this.mintMaxReverseSpeed;public AbsoluteDirection Directiongetreturn this.mDirection;public void Turn(RelativeDirection paramDirection)AbsoluteDirection newDirection;switch(paramDirection)case RelativeDirection.Right:newDirection = (AbsoluteDirection)(int)(this.mDirection + 1) %4);break;case RelativeDirection.Left:newDirection = (AbsoluteDirection)(int)(this.mDirection + 3) %4);break;case RelativeDirection.Back:newDirection = (AbsoluteDirection)(int)(this.mDirection + 2) %4);break;default:newDirection = AbsoluteDirection.North;break;this.mDirection = newDirection;this.NotifyObservers();public void Accelerate(int paramAmount)this.mintSpeed += paramAmount;if(mintSpeed = this.mintMaxSpeed) mintSpeed = mintMaxSpeed;this.NotifyObservers();public void Decelerate(int paramAmount)this.mintSpeed -= paramAmount;if(mintSpeed = Model.MaxSpeed)View.DisableAcceleration();View.EnableDeceleration();else if(Model.Speed = Model.MaxTurnSpeed)View.DisableTurning();elseView.EnableTurning(); 這里是我們的ACME200SportsCar類(從抽象類Automobile繼承,實(shí)現(xiàn)了IVehicleModel接口):public class ACME2000SportsCar:Automobilepublic ACME2000SportsCar(string paramName):base(250, 40, -20, paramName)public ACME2000SportsCar(string paramName, int paramMaxSpeed, int paramMaxTurnSpeed, int paramMaxReverseSpeed):base(paramMaxSpeed, paramMaxTurnSpeed, paramMaxReverseSpeed, paramName) 現(xiàn)在輪到我們的View了現(xiàn)在終于開始建立我們MVC最后一個部分了View!我們要建立一個AutoView來實(shí)現(xiàn)IVehicleView接口。這個AutoView將會有對Control和Model接口的引用。public class AutoView : System.Windows.Forms.UserControl, IVehicleView private IVehicleControl Control = new ACME.AutomobileControl(); private IVehicleModel Model = new ACME.ACME2000SportsCar(Speedy); 我們也需要將所有的東西包裝在UserControl的構(gòu)造函數(shù)中。public AutoView()/ This call is required by the Windows.Forms Form Designer.InitializeComponent();WireUp(Control, Model);public void WireUp(IVehicleControl paramControl, IVehicleModel paramModel)/ If were switching Models, dont keep watching/ the old one! if(Model != null)Model.RemoveObserver(this);Model = paramModel;Control = paramControl;Control.SetModel(Model);Control.SetView(this);Model.AddObserver(this); 下面,加入我們的Button和一個label來顯示ACME2000 Sports Car的狀態(tài)還有狀態(tài)條用來為所有的Buttons來顯示編碼。private void btnAccelerate_Click(object sender, System.EventArgs e)Control.RequestAccelerate(int.Parse(this.txtAmount.Text);private void btnDecelerate_Click(object sender, System.EventArgs e)Control.RequestDecelerate(int.Parse(this.txtAmount.Text);private void btnLeft_Click(object sender, System.EventArgs e)Control.RequestTurn(RelativeDirection.Left);private void btnRight_Click(object sender, System.EventArgs e)Control.RequestTurn(RelativeDirection.Right); 加入一個方法來更新接口public void UpdateInterface(IVehicleModel auto)this.label1.Text = auto.Name + heading + auto.Direction.ToString() + at speed: + auto.Speed.ToString();this.pBar.Value = (auto.Speed0)? auto.Speed*100/auto.MaxSpeed : auto.Speed*100/auto.MaxReverseSpeed; 最后我們實(shí)現(xiàn)IVehicleView接口的方法。public void DisableAcceleration()this.btnAccelerate.Enabled = false;public void EnableAcceleration()this.btnAccelerate.Enabled = true;public void DisableDeceleration()this.btnDecelerate.Enabled = false;public void EnableDeceleration()this.btnDecelerate.Enabled = true;public void DisableTurning()this.btnRight.Enabled = this.btnLeft.Enabled = false;public void EnableTurning()this.btnRight.Enabled = this.btnLeft.Enabled = true;public void Update(IVehicleModel paramModel)this.UpdateInterface(paramModel); 我們終于結(jié)束了!現(xiàn)在我們可以來測試ACME2000 Sports Car了。一切按計劃進(jìn)行,然后我們找到ACME的主管人員,但他想要開一個載貨卡車而不是運(yùn)動車。幸運(yùn)的是我們用的是MVC!我們需要做的所有工作就是建立一個新的ACMETruck類,包裝一下,完事!public class ACME2000Truck: Automobilepublic ACME2000Truck(string paramName):base(80, 25, -12, paramName)public ACME2000Truck(string paramName, int paramMaxSpeed, int paramMaxTurnSpeed, int paramMaxReverseSpeed):base(paramMaxSpeed, paramMaxTurnSpeed, paramMaxReve
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年激光比長儀項(xiàng)目發(fā)展計劃
- 4 月相變化的規(guī)律 教學(xué)設(shè)計-2023-2024學(xué)年科學(xué)三年級下冊教科版
- 2024級語文上冊習(xí)作我有一個想法教學(xué)設(shè)計
- (公開課教案)五年級上冊語文《通往廣場路不止一條》教學(xué)設(shè)計
- 2023-2024學(xué)年高中英語 Unit 1 Cultural Heritage Reading for writing 教學(xué)實(shí)錄 新人教版必修第二冊
- 2023一年級數(shù)學(xué)上冊 5 6~10的認(rèn)識和加減法第4課時 解決問題1教學(xué)實(shí)錄 新人教版
- 12 慧眼看交通(教學(xué)設(shè)計)2023-2024學(xué)年統(tǒng)編版道德與法治三年級下冊
- 9古詩三首 秋夜將曉出籬門迎涼有感 教學(xué)設(shè)計-2023-2024學(xué)年語文五年級下冊統(tǒng)編版
- 2024-2025學(xué)年高中歷史 專題6 杰出的中外科學(xué)家 一 中國科技之光教學(xué)實(shí)錄 人民版選修4
- 2023一年級語文上冊 第二單元 4 d t n l配套教學(xué)實(shí)錄 新人教版
- 《不合格品管理》課件
- 駕駛員春季安全行車培訓(xùn)
- 俄烏沖突專題解讀課件
- 2024年廣西職業(yè)院校技能大賽高職組《視覺藝術(shù)設(shè)計》賽項(xiàng)規(guī)程
- JGJT46-2024《施工現(xiàn)場臨時用電安全技術(shù)標(biāo)準(zhǔn)》條文解讀
- 稅務(wù)局個人所得稅業(yè)務(wù)培訓(xùn)
- 餐廳服務(wù)員上菜培訓(xùn)
- 鉆機(jī)的基礎(chǔ)知識介紹
- ICU重癥患者康復(fù)護(hù)理
- 心理健康教育課件.他人眼中的我
- 簡單詞考研英語5500單詞表
評論
0/150
提交評論