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

Javascript 允许向对象添加和删除功能的设计模式,javascript,angularjs,Javascript,Angularjs,TL:DR为临时相互修改的半相关对象设计模式。先添加功能,然后删除功能 我是一名数据库开发人员,正在尝试学习一些较新的前端产品,因为我喜欢了解堆栈中不同点的情况。我不是一个OOP开发人员,但我对如何使用对象来看待问题有一个不错的想法,但我不知道所有的设计模式以及它们所处理的不同场景。我正在学习AngularJS,我决定重新创建棋盘游戏,作为快速定义需求的一种方式。下面是我试图建立的一个场景: 游戏的核心是力量和种族,每种力量和种族都有独特的方式来修改游戏规则。这些力量/种族组合用于征服区域获得积

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

我是一名数据库开发人员,正在尝试学习一些较新的前端产品,因为我喜欢了解堆栈中不同点的情况。我不是一个OOP开发人员,但我对如何使用对象来看待问题有一个不错的想法,但我不知道所有的设计模式以及它们所处理的不同场景。我正在学习AngularJS,我决定重新创建棋盘游戏,作为快速定义需求的一种方式。下面是我试图建立的一个场景:

游戏的核心是力量和种族,每种力量和种族都有独特的方式来修改游戏规则。这些力量/种族组合用于征服区域获得积分。这些修改在游戏的不同阶段触发:

  • 第一回合(富有:获得7分,这只发生一次)
  • 开始回合(Amazons:获得4个额外代币)
  • 进入下降阶段(食尸鬼:食尸鬼在下降阶段可以像活跃的种族一样进行游戏;强壮:进入下降阶段时,立即选择下一个种族)
  • 征服(突击队:少拿1个代币来征服一个地区)
  • 重新部署(Amazons:损失4个代币;堡垒:在你占领的区域放置一个堡垒。+1防御+1点此区域)
  • 结束回合(丘陵:在丘陵地区多获得1分;兽人:本回合每征服一个被占领地区+1分)
  • 多人/完全独特(外交官:选择你本回合没有攻击的人,他们在下一回合之前不能攻击你)
  • 此外,一些区域可以标记为具有一个或多个特殊属性:

  • 地雷:矮人即使在下降时也会从该区域获得+1点
  • 魔法来源:向导从该区域获得+1点
  • 黑社会:拥有黑社会力量的种族认为所有黑社会区域相邻
  • :需要额外的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”修改器应用于相邻区域。然后在轮到和的时候,我必须移除巨人队的所有修改器,然后为下一个球员和他们当前的比赛应用这些修改器。跟踪修改器的归属变得非常混乱,并且开始变得异常难闻。关于更适合这种情况的设计模式有什么建议吗?

    你应该查找构造函数和
    对象。定义属性我认为你应该做的是创建一个对象来跟踪可能会像这样继续下去的因素

    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];
        }
    }
    
    有了这种代码,您可以使用带有
    开关的
    对象.defineProperty
    ,向特定属性(特殊属性/修改)添加/删除点


    希望这能有所帮助。

    ?@Slitterlycuban我想到了decorator,但它不是为删除功能而设计的。或者我需要从不同的角度来思考这个问题,让它发挥作用。如果我放弃了修改一个区域的想法,并且所有逻辑都完全基于游戏单位在地图上的位置,那么也许装饰器可以工作。@tryingtogetprogrammingdirect,这就是我添加TL的原因;DR.什么是用于添加和删除对象功能的实体设计模式。我最初看的是decorator,但它并不是为了去掉功能而设计的。有趣的是,我可以用Java描述decorator,但我的JS kung-foo无法胜任。要点:Decorator看起来像一个包装器,因此您的Decorator接口将有一个“undecorate”,返回包装的类以删除行为修改。“无论如何,我在Java中也是这样做的。”我将重读decorator。这正是我认为这应该起作用的方式。谢谢。我认为你的第一个片段更符合我的想法。我很犹豫是否将“amazon,Rich,orcs”等属性添加为布尔值,因为这意味着我将在其他地方检查该布尔值,这可能会导致我试图避免的依赖项列表混乱。如果我帮助您接受我的答案,如果您还需要其他帮助,请详细说明或询问其他问题。我一直很乐意帮助你(这就是我们来这里的目的)。你的回答肯定很有用,我很感激你花时间帮助我,但我不确定这是不是正确的答案。