Шаблон оформления фасада, получить атрибут с фасада - PullRequest
1 голос
/ 04 июля 2011

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

Из примера:
Фасад = Компьютер
Запчасти: процессор, память ...

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

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

1 Ответ

1 голос
/ 04 июля 2011

если я понимаю, что вы хотите что-то вроде этого: вам нужно отправить 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

...