Шаблон проектирования фасада, получить атрибут от фасада

У меня есть что-то вроде шаблона дизайна фасада в моем приложении. Мы можем начать с этого: http://www.patternsforphp.org/doku.php?id=facade

Из примера:
Фасад = Компьютер
Части: ЦП, память...

И какое решение этой ситуации: Компьютер имеет идентификатор. Большинству частей не нужно знать об идентификаторе компьютера, но есть несколько частей, которые общаются с World, например. Сетевая карта, для которой нужно знать ID компьютера, в который она ставится.

Что делать - какое решение лучше?
Спасибо за ответы.


person Jaroslav Moravec    schedule 04.07.2011    source источник
comment
Если я кодировал эту часть кода, то я не знал, что это фасад - он встал естественным образом. Но это осложнение, если код все еще очень хорошо обслуживается и проблемы с согласованностью. Что делать, если идентификатор будет изменен?   -  person Jaroslav Moravec    schedule 04.07.2011
comment
Не могли бы вы уточнить вопрос, пожалуйста, потому что сейчас я вообще не понимаю, о чем вы спрашиваете. Фасад определяет интерфейс более высокого уровня, упрощающий использование подсистемы.   -  person Gordon    schedule 04.07.2011
comment
На самом деле: у меня есть статический класс с методом Javascript::addVariable(), который переносит переменную из php в javascript. Некоторые части фасада должны передавать некоторые переменные в javascript, но в javascript мне нужно присвоить эти значения компьютеру.   -  person Jaroslav Moravec    schedule 04.07.2011
comment
У меня не настоящий фасад. Но система классов такая же, как в примере (url) выше.   -  person Jaroslav Moravec    schedule 04.07.2011
comment
Вы уверены, что компьютеру нужен идентификатор? Может быть, идентификатор следует перенести на сетевую карту как ее Mac-адрес или что-то в этом роде?   -  person Arseny    schedule 04.07.2011


Ответы (1)


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

class CPU
{
    public function freeze() { /* ... */ }
    public function jump( $position ) { /* ... */ }
    public function execute() { /* ... */ }

}

class Memory
{
    public function load( $position, $data ) { /* ... */ }
}

class HardDrive
{
    public function read( $lba, $size ) { /* ... */ }
}

class NetworkDrive
{
     private $computerId;

     public function __construct($id)
     {
         $this->computerId = $id;
     }

     public function send() { echo $this->computerId; }

}

/* Facade */
class Computer
{
    protected $cpu = null;
    protected $memory = null;
    protected $hardDrive = null;
    protected $networkDrive = null;
    private $id = 534;

    public function __construct()
    {
        $this->cpu = new CPU();
        $this->memory = new Memory();
        $this->hardDrive = new HardDrive();
        $this->networkDrive = new NetworkDrive($this->id);
    }

    public function startComputer()
    {
        $this->cpu->freeze();
        $this->memory->load( BOOT_ADDRESS, $this->hardDrive->read( BOOT_SECTOR, SECTOR_SIZE ) );
        $this->cpu->jump( BOOT_ADDRESS );
        $this->cpu->execute();
        $this->networkDrive->send();
    }
}

/* Client */
$facade = new Computer();
$facade->startComputer();

Вы можете использовать шаблон наблюдателя, чтобы уведомить объект networkDrive о возможном изменении computerId.

person Andrey Andrei    schedule 04.07.2011
comment
Да, это оно. Но... У меня плохое предчувствие, что я хранил идентификатор компьютера в нескольких объектах вместо одного. (согласованность - изменение идентификатора компьютера и т. д.) - person Jaroslav Moravec; 04.07.2011
comment
Итак, я думаю, мне нужно что-то вроде указателя на экземпляр компьютера в сетевой карте вместо идентификатора. (Можно предположить, что у компьютера есть метод getId()). - person Jaroslav Moravec; 04.07.2011
comment
когда вы меняете идентификатор компьютера, вы можете использовать шаблон наблюдателя и уведомлять объект NetworkDrive об изменении сохраненного идентификатора компьютера. Может быть решением. вы не можете отправить ссылку, потому что вы можете изменить значение в networkDrive, и это не так хорошо. Вы можете отправить весь объект Компьютер и использовать то, что вам нужно ( $this-›networkDrive = new NetworkDrive($this); ). Я рекомендую использовать шаблон наблюдателя - person Andrey Andrei; 04.07.2011
comment
Я понимаю. Это будет работать. Но все же у меня вопрос - есть ли более простой способ получить ID компьютера из его части? Без смены конструкторов. Легко, что-то вроде: ((Computer) Computers::getComputerByPart(IPart $this))-›getId(); Для этого нет шаблона (или лучшей практики)? - person Jaroslav Moravec; 04.07.2011
comment
это выглядит более сложным для реализации, но я думаю, что это возможно. - person Andrey Andrei; 04.07.2011