2014-01-17 137 views
0

我有容器,其中包含其他容器,其中可以包含其他容器等。對象container1有特殊的方法foo(),我想從container3調用此方法。我怎樣才能做到這一點?如何從父容器調用方法

我想過單身人士設計模式,但在我的程序中存在不止一個類MyClass1的對象。我想過代表設計模式,但container2不必對MyClass1一無所知(這是沒有必要這樣)。

container1:MyClass1 
| 
+--container2:MyClass2 
| | 
| +---container3:MyClass3 
| | 
| +---container3:MyClass3 
| 
+---container4:MyClass4 
+0

但你如何知道結構?爲什麼你只能在容器3中通過父標識來獲取父項,併爲該對象調用該函數? – Anton

回答

0

您可以使用某種方式的依賴注入模式。

一個小例子:

interface FooContainer 
{ 
    function foo(); 
} 

Class Injector 
{ 
    private diContainer; 

    static function getInstance() 
    { 
     <singleton> 
    } 

    function addDependency(FooContainer $class, $key) 
    { 
     $this->diContainer[$key] = $class; 
    } 

    function getDependency($key) 
    { 
     return $this->diContainer[$key]; 
    } 
} 

Class Container1 implements FooContainer 
{ 
    function foo() 
    { 
     echo "Foo" 
    } 
} 

Class Container3 
{ 
    private fooClass; 

    function setFoo() 
    { 
     $this->fooClass = Injector::getInstance()->getDependency("foo"); 
     return $this; 
    } 

    function foo() 
    { 
     $this->fooClass->foo(); 
    } 
} 

,你這樣稱呼它。

$container1 = new Container1(); 
/** do whatever you need */ 
Injector::getInstance()->addDependency($container1, "foo");  
$container3 = new Container3();  
$container3->setFoo()->foo(); 
+0

這與Delegate模式不一樣嗎?你將如何解決將'container3'添加到'container2'的問題,'container2'對'container1'沒有任何瞭解。那麼如何設置'fooClass'? – user3106462

+0

container3是否知道container2? – Eternal1

+0

不是。每個容器都有自己的工作要做,而不是對其他容器感興趣。只有'container3'必須能夠通知'container1'它的工作結果。 – user3106462