2013-09-29 57 views
4

TL:DR設計圖案爲暫時修改每個-其他半相關的對象。功能被添加,然後被刪除。設計圖案,允許添加和刪除功能的一個對象

我的數據庫開發人員,我試圖去學習一些新的前端好吃的東西,我喜歡呆在知道什麼在堆棧中的不同點事情。我不是OOP開發人員,但我對如何使用對象查看問題有一個確定的想法,但我不知道他們處理的所有設計模式和不同場景。我正在學習AngularJS,並決定重新創建桌面遊戲Small World作爲快速定義我的需求的一種方式。這裏是我想建立一個基礎的情景:

遊戲的核心有權力和種族各有改變遊戲規則的獨特方式。這些力量/種族組合用於征服地區的積分。這些修改在遊戲中不同階段觸發:

  1. 第一次打開(富麗:拿到7分,這隻會發生一次)
  2. 開始回合(亞馬遜:獲得4個額外的令牌)
  3. 進入衰退(食屍鬼:食屍鬼可以像是一個活躍的比賽中播放時,在下降; 黑啤:進入衰退時,馬上挑選你的下一場比賽)
  4. Conque st(Commando:需要1個征服來征服一個區域)
  5. 重新部署(亞馬遜:失去4個令牌; 堡壘:在你佔領的地區放置一個堡壘。 +1防禦從本地區+1點)
  6. 結束回合(:1個獲得更多的點是在一個小山區域; 獸人:+1點,每個佔據區域征服你本回合)
  7. 多人遊戲/完全獨特的(外交官:挑一個你沒有攻擊這反過來,他們不能攻擊你,直到你的下一回合)

另外一些區域可以被標記爲具有一種或多種特殊屬性:

  1. :矮人要從本地區+1點,即使在下降
  2. 法力源泉:具有黑社會功率認爲種族:精靈從本地區
  3. 冥界得到+1點相鄰
  4. 所有黑道地區:需要1個令牌征服這一區域,+1防禦

在整個比賽過程中,比賽/力量組合將會出現,然後死亡將被另一場比賽/力量組合所取代。所以你可以看到有很多屬性/屬性需要跟蹤,而有些比賽存在。 (例如。這個回合你攻擊的人只對外交官很重要)。現在我可以定義屬性來處理所有已知的場景,但我的目標是允許將新的種族/權力添加到我的配置文件中,並讓遊戲瞭解如何處理其規則更改。我想出了所謂的改性材料的總體目標的想法,並正在組織我的對象,像這樣:

{ 
    event:'endTurn', // the game phase that triggers this modification 
    modify:{ 
    points: 1, //hill power 
    strength: -4, // amazon redeploy phase, applied to a gameRace 
    strength: -1, // commando conquest phase, applied to a region 
    actions:[function(gameState, region, gameRace){ 
     //use the above three params for conditional logic or more advanced modifiers like diplomat 
    }] 
    } 
} 


SWGame // is in charge of game state, phases, input from players 
+--+Player[] 
| | 
| +--+GameRace[] // handles interactions between/joining race and power. 
|  |   // players can have one declining race and one active race. 
|  |   // the spirited power allows 2 races in decline at once 
|  | 
|  +--+Race // has 0-n modifiers does not understand any other object 
|  | | 
|  | +---Modifier[] 
|  | 
|  +--+Power // has 0-n modifiers does not understand any other object 
|  | 
|  +---Modifier[] 
+--+GameMap // handles interctions between GameRaces and Regions 
    | 
    +--+Region[] // has 0-n modifiers does not understand any other object 
     | 
     +---Modifier[] 

我遇到的是一些比賽修改地區(如巨人的問題:如果你佔據了山上所有鄰近山區的地區花費1個征服令牌)。我正在對相鄰區域應用「強度:-1」修改器。那麼在回合中我必須移除巨人的所有修改器,然後爲下一名球員和他們目前的比賽應用修改器。跟蹤修改者屬於哪個變得非常混亂,並且它開始變得難以置信的臭。有關更適合此場景的設計模式的任何建議?

+3

[裝飾者](http://en.wikipedia.org/wiki/Decorator_pattern)? – SlightlyCuban

+0

@SlightlyCuban我想到了裝飾器,但它並不是爲了去除功能而設計的。或者,也許我需要用不同的術語來思考問題,以使其發揮作用。如果我放棄了修改區域的想法,並且所有的邏輯都完全基於遊戲單元在地圖上的位置,那麼裝飾器可以工作。 –

+0

@tryingToGetProgrammingStraight這就是爲什麼我加了TL; DR。什麼是用於添加和刪除對象功能的堅實設計模式。我最初看着裝飾器,但它不是爲了將功能帶走而設計的。 –

回答

1

你應該查找構造函數和object.defineProperty什麼,我認爲你應該做的就是創建一個對象來跟蹤的因素,可能會延續,像這樣

function example(obj){ 
    this.strengthEffects = obj.strengthEffects; 
    this.healthEffects = obj.healththEffects; 
} 

或更好,但

function example(obj){ 
    this.amazon = obj.amazon; //boolean value 
    //same idea 
} 

然後檢查他們的構造函數像這樣

function changeRace(new example(myObj)); 

changeRace(carryOver){ 
    for (var i in carryOver) { 
     this.prop = i; 
     this.propVal = carryOver[i]; 
    } 
} 

與這種類型的代碼,你可以使用object.definePropertyswitch來爲某個屬性(特殊屬性/修改)添加/刪除點。

希望這有助於。

+0

我認爲你的第一個片段更符合我的想法。我很猶豫是否將像「amazon,wealthy,orcs」這樣的屬性添加爲布爾值,因爲這意味着我將檢查該布爾值,這可能會導致我試圖避免的依賴項的混亂列表。 –

+0

好吧,如果我幫助你可以接受我的回答,如果還有其他問題你需要幫助指定它或問另一個問題。我總是樂於幫助(這就是我們在這裏)。 –

+0

你的答案絕對有用,我很感激你花時間來幫助我,但我不確定這是否是正確的答案。 –

相關問題