是否有一个设计模式,其功能类似于观察者与装饰器的混合?

时间:2012-10-16 22:50:15

标签: javascript design-patterns

我注意到,在不久之前使用类似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));
}

然后可能会触发事件并更新所有汽车组件。

2 个答案:

答案 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