2011-07-04 80 views
1

我在我的應用程序中有類似於外觀設計模式的東西。我們可以開始這樣的: http://www.patternsforphp.org/doku.php?id=facade外觀設計模式,從外觀獲取屬性

從例如:
門面=電腦
配件:CPU,內存...

而且該解決方案,這是什麼情況:計算機有一個ID。大部分零件不需要知道計算機ID,但有幾個零件與世界通信,例如,網卡需要知道放置的計算機ID。

怎麼辦 - 什麼是最好的解決方案?
感謝您的回覆。

+0

的最終變化。如果我編寫的代碼,我不知道這個部分,那就是門面 - 這自然而然地上升。但是,如果代碼仍然非常好,並且一致性問題仍然存在,那麼這是很複雜的。如果ID會改變怎麼辦? –

+0

你能澄清這個問題嗎?因爲現在我不明白你在問什麼。 Facade定義了一個更高級別的界面,使得子系統更易於使用。 – Gordon

+0

實際上:我有靜態類與方法Javascript :: addVariable()攜帶從PHP到JavaScript的變量。外觀的某些部分需要將一些變量傳遞給javascript,但在JavaScript中,我需要將這些值分配給計算機。 –

回答

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

+0

是的,就是這樣。但是......我有一種不好的感覺,就是將計算機的「ID」存儲在多個對象中,而不是一個。 (一致性 - 改變計算機的ID等) –

+0

所以我認爲,我需要像NetworkCard中的計算機實例指針而不是ID。 (我們可以設置該計算機有方法getId())。 –

+1

當您更改計算機ID時,可以使用觀察者模式,並通知NetworkDrive對象更改存儲的計算機ID。可以是一個解決方案。您無法發送參考,因爲您可以更改網絡驅動器中的值,但這不太好。您可以發送整個對象計算機,並使用您需要使用的($ this-> networkDrive = new NetworkDrive($ this);)。我建議使用觀察模式 –