設計模式(5)

2021-09-08 08:13:27 字數 1667 閱讀 4922

這篇日誌我們來介紹設計模式的一大原則:單一職責原則

單一職責原則(srp):就乙個類而言,應該僅有乙個引起他變化的原因

現在來設計俄羅斯方塊遊戲、要是我們完成這個小遊戲,我們的思路是什麼?我們一般會這樣考慮,首先他方塊下落的原理是畫四個小方塊,擦掉,然後再在下一行畫四個方塊。不斷的繪出和擦掉就形成了動畫,所以應該要有畫和擦方塊的**,然後左右鍵實現左移和右移,下鍵實現加速,上鍵實現旋轉,這其實都應該是函式,當然左右移動需要考慮碰撞問題,下移需要考慮堆積和消層問題。

步驟如下:

1、先建立乙個窗體、

2、加上乙個用於遊戲框架的控制項,比如panel或者picturebox,乙個按鈕button來控制「開始」

3、在放乙個timer控制項用於分時動畫的程式設計,實現繪出和擦出方塊,並作出堆積和消層判斷

4、編寫控制項的鍵盤事件

如果咱們的思路會是在這各種事件怎麼編寫,不會去考慮分類的事情。

這樣的話,我們面向過程開發已經根深蒂固了,咱會把所有的**都寫在form1.cs這個類中,這樣的**談何耦合度、復用性。咱重新回顧這個程式,如果現在咱寫的手機版的俄羅斯方塊程式,然後在windowsce上執行的程式,他們可以安裝.net框架的精簡版,執行c#語言編寫的應用程式,但pc上的普通的windowfrom介面的程式不能使用,那咱寫的程式該怎麼用?

或許會通過copy過去,然後在做些改進吧。

但是這裡面有一些是始終沒有變化的,像下落、旋轉、碰撞判斷、移動、堆積等遊戲邏輯

如果乙個類承擔的職責過多的話,就等於把這些職責耦合在一起了,乙個職責的變化可能會削弱或者抑制這個類完成其他職責的功能。這種耦合會導致脆弱的設計,當變化發生時,設計會遭受到意想不到的破壞。事實上,我們完全可以找出可以找出那些事介面,那些是遊戲邏輯,然後進行分離。

在遊戲中,方塊的可以動的是遊戲區域,可以設計為乙個二維整型陣列用來表示座標,寬 10、高 20,比如:int[,] arraysquare=new int[10,20];。那麼整個方塊的移動其實就是陣列的下標變化,比如原方塊在arraysquare[3,5]上,則下移時變成了arraysquare[3,6],若果下移同時還按了左鍵,則是arraysquare[2,6]。每個陣列的值就是是否存在方塊的標誌,存在為1、不存在預設為0。咱判斷是否能左移,就是判斷arrysquare[x,y]中的x-1是否小於0,否則就是撞牆了,或者arrysquare[x-1,y]是否等於1,否則就說明左側有堆積的方塊,所謂堆積,不過是判斷arrysquare[x,y+1]是否等於1的過程,如果是,則將自己arrysquare[x,y]的值改1。那麼消層,其實就是arrysquare[x,y]中迴圈x有0到9,判斷arrysquare[x,y]是否等於1,是則此行資料清零,並將其上方的陣列值遍歷下移一位。

所謂遊戲邏輯,不過就是陣列的每一項值的變化的問題,下落、旋轉、碰撞判斷,移動、堆積這些都是做陣列具體項的值的變化,而介面表示邏輯,不過是根據陣列的資料進行繪出和擦除、或者根據鍵盤命令呼叫陣列相應方法的改變,因此,至少應該考慮經此程式分為兩個類,乙個遊戲邏輯的類、乙個是winform窗體的類,當有一天要改變介面,或者換介面時,不過是窗體類的變化,和遊戲邏輯無關,以此達到復用的目的。

當然、軟體設計真正要做的許多內容,就是發現職責並把那些職責互相分離。其實要去判斷是否應該分離出來類了,也不能,那就是如果你能夠想到多於乙個的動機去改變乙個類,那麼這個類就具有多於乙個的職責,就應該考慮類的職責分離,介面的變化是和遊戲本身沒有關係的,介面是很容易變化的,而遊戲邏輯是不太容易變化的。

設計模式5

decorator模式 我覺得這個模式有點繞。需要很仔細的來分清其中的繼承關係。decorator模式的使用場景 當你要描述乙個東西,比如說 人 這個東西,你回構建乙個人的class,它包括很多人的屬性,比如身高,體重,性別,年齡等等,你還有很多的施加於 人 上面的方法,比如吃飯,睡覺,跑步等等。但...

設計模式(5) 狀態模式

允許乙個物件在其內部狀態改變時改變它的行為。物件看起來似乎修改了它的類。它有兩種使用情況 1 乙個物件的行為取決於它的狀態,並且它必須在執行時刻根據狀態改變它的行為。2 乙個操作中含有龐大的多分支的條件語句,且這些分支依賴於該物件的狀態。比如乙個你和心愛的那個 在軟體構建過程中,某些物件的狀態如果改...

模式設計學習(5)

今天學習下行為模式中的一種 command 命令 模式。通俗的來講,就是client需要執行一條 或一系列 命令,也可以說要發觸發乙個事件 發乙個訊息 使用該模式,則client傳送訊息時不需要知道訊息的接收者是誰。因為在command物件中,已經關聯了某條訊息的接收者。所以訊息的傳送者僅僅需要知道...