我注意到,在不久之前使用类似XNA / C#(游戏引擎)之类的东西时,您只需将组件添加到对象中,并为其提供额外的功能。例如:
Class Spaceship 包含组件,可攻击,重力,控件等等...
通常,这些组件实现IUpdatable / IDrawable接口或DrawableGameComponent或其他:https://gamedev.stackexchange.com/questions/20918/what-happens-when-i-implement-iupdateable-or-idrawable-in-xna
当需要更新/绘制或其他“事件”时,所有被调用的组件都会被调用,这让我想到了观察者模式。然而,这些功能似乎正在“装饰”主要类别。
这是一种已知的模式吗?这叫什么?这是一个在游戏开发之外使用的好模式吗?我标记JavaScript的原因是因为我正在考虑在JS中做这样的事情,我想知道是否有人见过有人做类似的事情。
看起来像这样:
function Watcher() {
this.components = [];
this.update() = function() {
for (component in this.components) {
if (typeof component.update === "function") {
component.update();
}
}
};
}
function Component() {
this.update = function() {
};
}
function Wiggle(obj) {
_.extend(this, Component.prototype);
this.obj = obj;
this.wiggled = false;
this.update = function() {
if (this.wiggled) {
this.obj.x -= 1;
} else {
this.obj.x += 1;
}
wiggled = !wiggled;
};
}
function Car() {
this.x = 0;
_.extend(this, Watcher.prototype);
this.components.push(new Wiggle(this));
}
然后可能会触发事件并更新所有汽车组件。
答案 0 :(得分:2)
我认为你的意思是mixins(Javascript)或Traits(PHP)
Mixins基本上只是_.extend'ing(或$ .extend'ing)当前对象与另一个对象(已经有一些属性/函数)。您可以在http://www.joezimjs.com/javascript/javascript-mixins-functional-inheritance/
上阅读更多相关信息PHP(5.4)的特性有点强,你可以做很多很酷的事情。这是stackoverflow的一个很好的例子:Traits in PHP – any real world examples/best practices?
答案 1 :(得分:1)
复合模式?
为常见行为定义接口(Component
)(update
方法)
让所有组件实现Component
(可碰撞,重力,控制等)
让父类SpaceShip
维护Component
s
让父类SpaceShip
也实现Component
。
从客户端角度SpaceShip
是一个提供update
方法的对象。
在内部,使用update
方法,SpaceShip
在所有update
上调用Component