2013-05-28 2 views
0

Я сейчас читаю книгу о шаблонах проектирования и в книге, которую он использует пример, как это:Назначение нескольких классов для инициализирован объект

<?php 
//Client.php 
/*Age groups: 
18-29: Group 1 
30-39: Group 2 
40-49: Group 3 
50+ : Group 4 
*/ 
function __autoload($class_name) 
{ 
    include $class_name . '.php'; 
} 

class Client 
{ 
    //$hotDate is component instance 
    private $hotDate; 

    public function __construct() 
    { 
     $this->hotDate=new Female(); 
     $this->hotDate->setAge("Age Group 4"); 
     echo $this->hotDate->getAge(); 
     $this->hotDate=$this->wrapComponent($this->hotDate); 
     echo $this->hotDate->getFeature(); 
    } 

    private function wrapComponent(IComponent $component) 
    { 
     $component=new ProgramLang($component); 
     $component->setFeature("php"); 
     $component=new Hardware($component); 
     $component->setFeature("lin"); 
     $component=new Food($component); 
     $component->setFeature("veg"); 
     return $component; 
    } 
} 

$worker=new Client(); 
?> 

Мой вопрос функция wrapComponent. Как можно инициализировать переменную класса несколько раз, не теряя прежнего содержимого? На мой взгляд, единственное, что могло бы вернуться, было бы компонентом класса Food, поскольку он был последним, который был инициализирован. Извините, если это очевидный вопрос, но я ничего не нашел в Интернете, и я никогда не видел этого раньше.

+0

Методы 'ProgramLang',' Hardware' и 'Food' могут возвращать объект с предыдущими данными + новые данные внутри. Таким образом, результат может быть кумулятивным. – kevinamadeus

ответ

0

Следует помнить, что объекты передаются по ссылке, поэтому, когда вы переназначаете значения в ссылку, это уничтожит только объект, нет других ссылок на него.

Новая операция разрешается перед назначением в каждом из этих случаев, так что ссылка сохраняется в компоненте по всей цепочке, эта ссылка существует в каждом из вновь созданных объектов.

0

Это, вероятно, реализация декоратора.
Найти here другой пример, который может помочь вам понять этот шаблон.

Смежные вопросы