立面设计模式,从外观获取属性

时间:2011-07-04 10:10:11

标签: php design-patterns facade

我的应用程序中有类似外观设计模式的东西。我们可以从这开始: http://www.patternsforphp.org/doku.php?id=facade

从例子:
Facade =计算机
零件:CPU,内存......

这种情况的解决方案是什么:计算机有一个ID。大多数部分不需要了解计算机ID,但有几个部分与World通信,例如。网卡,需要知道放置的计算机ID。

怎么做 - 什么是最好的解决方案?
谢谢你的回复。

1 个答案:

答案 0 :(得分: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