允许向对象添加和删除功能的设计模式
Design pattern that allows to add and remove functionality to an object
TL:DR 半相关对象的设计模式,这些对象会暂时相互修改。 功能是添加的,然后是删除的。
我是一名数据库开发人员,正在尝试学习一些较新的前端好东西,因为我喜欢了解堆栈中不同点发生的事情。我不是OOP开发人员,但我对如何使用对象查看问题有一个很好的想法,但我不知道所有的设计模式和它们处理的不同场景。我正在学习AngularJS,我决定重新创建棋盘游戏小世界,作为快速定义我的需求的一种方式。以下是我试图为其建立基础的场景:
游戏的核心是力量和种族,每个都有独特的方法来修改游戏规则。这些力量/种族组合用于征服地区以获得积分。这些修改在游戏的不同阶段触发:
- 第一回合(富有:获得7分,这只发生一次(
- 开始转弯(亚马逊:获得 4 个额外代币( 进入衰落
- (食尸鬼:食尸鬼在衰落时可以像活跃的种族一样玩;粗壮:进入下降时立即选择您的下一场比赛(
- 征服(突击队:征服一个地区需要少1个代币(
- 重新部署(亚马逊:丢失 4 个代币;要塞:在你占领的地区放置一个要塞。+1 防御 +1 点来自该区域(
- 结束转弯(山丘:在山丘区域多获得 1 分;兽人: 本回合你征服的每个占领区域+1点(
- 多人游戏/完全独特(外交官:选择你这个回合没有攻击的人,他们不能攻击你,直到你的下一个回合(
此外,某些区域可以标记为具有一个或多个特殊属性:
- 我的:矮人即使在下降时也能从这个区域获得+1点
- 魔法来源:巫师从该区域获得+1分 黑社会
- :拥有黑社会力量的种族将所有黑社会地区都视为相邻
- 山:多拿1个令牌来征服这个区域,+1 防御
将出现,然后死亡,被另一个种族/力量组合取代。所以你可以看到,当一些种族存在时,我需要跟踪许多属性/统计数据。(例如,你攻击了谁这个回合只对外交官很重要(。现在我可以定义属性来处理所有已知场景,但我的目标是允许将新的种族/力量添加到我的配置文件中,并让游戏了解如何处理其规则更改。我想出了一个名为 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 个代币(。 我正在对相邻区域应用"强度:-1"修饰符。 然后在回合的 and 中,我必须删除巨人的所有修饰符,然后为下一个玩家和他们当前的种族应用修饰符。跟踪修饰符属于谁变得非常混乱,并且开始变得非常臭。关于更适合此方案的设计模式的任何建议?
您应该查找构造函数并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];
}
}
使用这种代码,您可以使用带有switch
的object.defineProperty
来添加/删除指向某个属性的点(特殊属性/修改(。
希望这有帮助。
- 删除CKEditor工具栏按钮,但不删除功能
- 主体单击删除功能上的输入框宽度
- 在以下情况下,如何使用AJAX实现删除功能
- 如何在更改屏幕大小时删除功能(菜单响应)
- 删除功能不工作angularjs
- 是的,没有带有链接的JavaScript删除功能的选项
- 单击时从内存中删除功能
- 索引数据库:删除功能不起作用
- 我的Ruby在轨道上删除功能不起作用
- 二叉搜索树“删除”功能的优化
- 我的播放器播放列表删除功能不起作用
- 我正在尝试制作一个锚标签删除功能
- 允许向对象添加和删除功能的设计模式
- AngularJS - 做应用程序将提交和删除功能放入工厂
- AngularJS + ExpressJS + 猫鼬:添加删除功能
- highcharts系列删除功能删除所有原始系列数据(即使存储在新变量中)
- 正在尝试创建具有删除功能的待办事项列表
- Jquery删除功能
- Rails AJAX删除功能工作,但在刷新之前不会自行删除
- 添加,编辑和删除功能,我的javascript