2012-10-16 56 views
3

我注意到,當前不久使用類似XNA/C#(遊戲引擎)的東西時,您只需將組件添加到對象中,併爲其提供了額外的功能。例如:有沒有像裝飾者混合的觀察者那樣的設計模式?

類飛船具有組件,可碰撞重力控制更多...

通常,這些組件實現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)); 
} 

活動可能會引發和所有的汽車部件將被更新。

回答

1

Composite pattern?

定義爲共同行爲的接口(Component)(該update方法)

讓所有impletment Component(可碰撞,重力,控制等)

讓父類SpaceShip保持的列表中的組件Component s

讓父類SpaceShip也實現Component

從客戶端角度來看SpaceShip是一個對象,它提供了update方法。

內部,在它的update方法,SpaceShip呼籲update上的所有Component小號

+0

這可以工作!我也將其確定爲行動/事件偵聽器。是的,行動是有限的,你可以添加一個功能,讓你添加更多的「行動」或「事件」。我只是想接受你的!哈 :) – Parris

2

我想你的意思混入(JavaScript)的或性狀(PHP)

混入基本上只是_.extend'ing(或$ .extend'ing)您當前對象與其他對象(即已經有一些屬性/ 功能)。你可以在http://www.joezimjs.com/javascript/javascript-mixins-functional-inheritance/

上閱讀更多關於PHP(5.4)的特性,它有點強大,你可以做很多很酷的事情。下面是一個很好的例子:Traits in PHP – any real world examples/best practices?

+0

嗯,我不認爲有什麼正在擴展。如果這些「組件」中存在某個更新函數,則在主對象的更新函數被調用時它將被調用。然而,我可以反轉這個邏輯,只是調用嵌套對象的所有更新函數,但是這並沒有真正使用我認爲的設計模式。 – Parris

+0

http://jsfiddle.net/SfZyf/是你的意思嗎? – Peeter

+0

是的,那正是我所說的。但是,這是我想要做的事情:http://jsfiddle.net/B4ARF/1/它不應該工作。把它想成僞碼吧。更新問題!謝謝! – Parris