允许向对象添加和删除功能的设计模式

时间:2013-09-29 14:40:26

标签: javascript angularjs

TL:DR 设计模式,用于临时相互修改的半相关对象。添加然后删除功能。

我是一名数据库开发人员,我正在尝试学习一些较新的前端好东西,因为我希望了解堆栈中不同点上发生的事情。我不是OOP开发人员,但我对如何使用对象查看问题有一个很好的想法,但我不知道所有的设计模式和他们处理的不同场景。我正在学习AngularJS,我决定重新创建棋盘游戏Small World,以便快速定义我的要求。以下是我试图建立基础的场景:

游戏的核心是Powers and Races,每种都有一种修改游戏规则的独特方式。这些Power / Race组合用于征服区域以获得积分。这些修改是在游戏的不同阶段触发的:

  1. First Turn( Wealthy :获得7分,这只发生一次)
  2. 开始转弯(亚马逊:获得4个额外令牌)
  3. 输入拒绝(食尸鬼:食尸鬼在下降时可以像活跃的种族一样玩; 粗壮:当输入下降时立即选择下一场比赛)
  4. 征服(突击队:征服一个地区需要少一个代币)
  5. 重新部署(亚马逊:输掉4个代币; 要塞:在你占据的区域放置一个要塞.1.1防御+1点来自该地区)
  6. 结束转弯(希尔:在山区获得1分; 兽人:本回合征服的每个占领区域+1分)
  7. 多人/完全独特(外交官:选择本轮未攻击的人,直到下一回合他们才能攻击你)
  8. 此外,某些地区可以标记为具有一个或多个特殊属性:

    1. 我的:矮人即使在下降时也会从这个区域获得+1分
    2. 魔力来源:向导从此区域获得+1分
    3. 黑社会:拥有黑社会权力的种族认为邻近所有黑社会地区
    4. Mountain :再获取1个令牌征服此区域,+1防御
    5. 在整个比赛过程中,比赛/力量组合将会出现,然后死亡,由另一场比赛/力量组合取代。因此,您可以看到,在某些比赛存在时,我需要跟踪许多属性/统计数据。 (例如,你在本回合中受到攻击的人只对外交官很重要)。现在我可以定义属性来处理所有已知的场景,但我的目标是允许将新的种族/权力添加到我的配置文件中,并让游戏了解如何处理他们的规则更改。我提出了一个名为Modifier的通用对象的想法,我正在组织我的对象:

      {
        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个令牌来征服)。我正在向相邻区域应用“strength:-1”修饰符。然后在转弯和转弯时我必须移除巨人的所有修改器,然后将修改器应用于下一个玩家及其当前的比赛。跟踪修改器所属的人变得非常混乱,它开始变得非常臭。关于更适合这种情况的设计模式的任何建议?

1 个答案:

答案 0 :(得分: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.defineProperty的{​​{1}}来添加/删除某个属性的点(特殊属性/修改)。

希望这会有所帮助。