Javascript 允许向对象添加和删除功能的设计模式
TL:DR为临时相互修改的半相关对象设计模式。先添加功能,然后删除功能 我是一名数据库开发人员,正在尝试学习一些较新的前端产品,因为我喜欢了解堆栈中不同点的情况。我不是一个OOP开发人员,但我对如何使用对象来看待问题有一个不错的想法,但我不知道所有的设计模式以及它们所处理的不同场景。我正在学习AngularJS,我决定重新创建棋盘游戏,作为快速定义需求的一种方式。下面是我试图建立的一个场景: 游戏的核心是力量和种族,每种力量和种族都有独特的方式来修改游戏规则。这些力量/种族组合用于征服区域获得积分。这些修改在游戏的不同阶段触发:Javascript 允许向对象添加和删除功能的设计模式,javascript,angularjs,Javascript,Angularjs,TL:DR为临时相互修改的半相关对象设计模式。先添加功能,然后删除功能 我是一名数据库开发人员,正在尝试学习一些较新的前端产品,因为我喜欢了解堆栈中不同点的情况。我不是一个OOP开发人员,但我对如何使用对象来看待问题有一个不错的想法,但我不知道所有的设计模式以及它们所处理的不同场景。我正在学习AngularJS,我决定重新创建棋盘游戏,作为快速定义需求的一种方式。下面是我试图建立的一个场景: 游戏的核心是力量和种族,每种力量和种族都有独特的方式来修改游戏规则。这些力量/种族组合用于征服区域获得积
{
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”等属性添加为布尔值,因为这意味着我将在其他地方检查该布尔值,这可能会导致我试图避免的依赖项列表混乱。如果我帮助您接受我的答案,如果您还需要其他帮助,请详细说明或询问其他问题。我一直很乐意帮助你(这就是我们来这里的目的)。你的回答肯定很有用,我很感激你花时间帮助我,但我不确定这是不是正确的答案。