Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Facade设计模式,从Facade获取属性_Php_Design Patterns_Facade - Fatal编程技术网

Php Facade设计模式,从Facade获取属性

Php Facade设计模式,从Facade获取属性,php,design-patterns,facade,Php,Design Patterns,Facade,我的应用程序中有一些类似于facade设计模式的东西。我们可以开始这样做: 来自示例: 外观=计算机 部件:CPU,内存 这种情况下的解决方案是什么:计算机有一个ID。大多数部件不需要知道计算机ID,但有几个部件需要与世界通信,例如网卡,需要知道放置在其中的计算机ID 做什么-最好的解决方案是什么? 谢谢你的回复。如果我知道你想要这样的东西: 创建特定零件并将其存储在对象中时,需要将计算机ID发送到特定零件。就像在NetworkDrive中一样。 之后,您可以根据需要使用computerId

我的应用程序中有一些类似于facade设计模式的东西。我们可以开始这样做:

来自示例:
外观=计算机
部件:CPU,内存

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

做什么-最好的解决方案是什么?

谢谢你的回复。

如果我知道你想要这样的东西: 创建特定零件并将其存储在对象中时,需要将计算机ID发送到特定零件。就像在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的最终更改: 创建特定零件并将其存储在对象中时,需要将计算机ID发送到特定零件。就像在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的最终更改

如果我对这部分我不知道的代码进行了编码,那就是facade,它已经自然上升了。但是,如果代码仍然具有很好的可维护性和一致性问题,那么这就很复杂了。如果身份证会被更改怎么办?你能澄清一下这个问题吗?因为现在我根本不明白你在问什么。Facade定义了一个更高级别的接口,使子系统更易于使用。facade的某些部分需要携带一些变量到javascript,但在javascript中,我需要将这些值分配给计算机。我没有真正的facade。但类的系统与上面的示例(url)相同。您确定计算机需要ID吗?可能是身份证应该被移动到网卡上作为它的Mac地址或类似的东西?如果我编码了我不知道的这部分代码,那就是门面-它已经自然上升了。但是,如果代码仍然具有很好的可维护性和一致性问题,那么这就很复杂了。如果身份证会被更改怎么办?你能澄清一下这个问题吗?因为现在我根本不明白你在问什么。Facade定义了一个更高级别的接口,使子系统更易于使用。facade的某些部分需要携带一些变量到javascript,但在javascript中,我需要将这些值分配给计算机。我没有真正的facade。但类的系统与上面的示例(url)相同。您确定计算机需要ID吗?可能该ID应该作为其Mac地址或类似的地址移动到网卡上?是的,就是这样。但是我有一种不好的感觉,将计算机的id“存储”在多个对象中,而不是一个对象中。(一致性-更改计算机的id等)因此,我想,我需要像NetworkCard中指向计算机实例的指针之类的东西,而不是id。(我们可以假定该计算机具有方法getId())。当您更改计算机id时,您可以使用观察者模式,并通知NetworkDrive对象更改存储的计算机id。这可能是一个解决办法。您无法发送引用,因为您可以更改networkDrive中的值,但这并不好。您可以发送整个对象计算机,并使用需要使用的($this->networkDrive=newnetworkdrive($this);)。我建议使用我理解的观察者模式。它会起作用的。但是,我仍然有一个问题——有没有更好的方法从它的部件中获取计算机的ID?不改变构造函数。简单,类似于:((计算机)计算机::getComputerByPart(IPart$this))->getId();没有这种模式(或最佳实践)?这看起来更难实现,但我认为可以实现。是的,就是这样。但是我有一种不好的感觉,将计算机的id“存储”在多个对象中,而不是一个对象中。(一致性-更改计算机的id等)因此,我想,我需要像NetworkCard中指向计算机实例的指针之类的东西,而不是id。(我们可以假定该计算机具有方法getId())。当您更改计算机id时,您可以使用观察者模式,并通知NetworkDrive对象更改存储的计算机id。这可能是一个解决办法。您无法发送引用,因为您可以更改networkDrive中的值,但这并不好。您可以发送整个对象计算机,并使用需要使用的($this->networkDrive=newnetworkdrive($this);)。我建议使用我理解的观察者模式。它会起作用的。但是,我仍然有一个问题——有没有更好的方法从它的部件中获取计算机的ID?不改变构造函数。简单,类似于:((计算机)计算机::getComputerByPart(IPart$this))->getId();没有这种模式(或最佳实践)?这看起来更难实现,但我认为这是可能的。