3

少し前に XNA/C# (ゲーム エンジン) のようなものを使用していたときに、オブジェクトにコンポーネントを追加するだけで追加の機能が得られることに気付きました。例えば:

クラス Spaceshipには、 CollidableGravityControlsなどのコンポーネントがあります...

通常、これらのコンポーネントは IUpdatable/IDrawable インターフェイスまたは DrawableGameComponent などを実装します。

更新/描画またはその他の「イベント」になると、それらのイベントを持つすべてのコンポーネントが呼び出され、オブザーバーパターンを思い浮かべます。しかし、これらの関数はメイン クラスを「装飾」しているように見えます。

これは既知のパターンですか?それはなんと呼ばれていますか?これは、ゲーム開発以外で使用するのに適したパターンですか? 私が 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));
}

その後、イベントがトリガーされ、すべての車のコンポーネントが更新されます。

4

2 に答える 2

2

mixins(Javascript)またはTraits(PHP)を意味していると思います

ミックスインは基本的に、現在のオブジェクトを別のオブジェクト (すでにいくつかの属性/関数を持っている) で _.extend'ing (または $.extend'ing) するだけです。詳細については、http://www.joezimjs.com/javascript/javascript-mixins-functional-inheritance/ を参照してください。

PHP (5.4) の Traits は少し強化されており、多くの非常に優れた機能を実行できます。以下は、stackoverflow の良い例です: PHP の特徴 – 実際の例/ベスト プラクティスはありますか?

于 2012-10-16T22:54:48.663 に答える
1

複合パターン?

Component共通の動作 (updateメソッド)のインターフェイス ( ) を定義します。

すべてのコンポーネントを実装しますComponent(衝突可能、重力、コントロールなど)

親クラスにのSpaceShipリストを維持させるComponent

親クラスもSpaceShip実装 Componentしましょう。

クライアントの観点からは、メソッドSpaceShipを提供するオブジェクトです。update

内部的には、そのupdateメソッドで、すべてのをSpaceShip呼び出しますupdateComponent

于 2012-10-18T06:50:14.863 に答える