2011-07-04 4 views
1

私のアプリケーションにはファサードデザインパターンのようなものがあります。例から http://www.patternsforphp.org/doku.php?id=facadeファサードデザインパターン、ファサードからアトリビュートを取得

:私たちは、これを起動することができます
ファサード=コンピュータ
パーツ:CPU、メモリ...

そして、何ソリューションは、このような状況です:コンピュータがIDを持っています。ほとんどの部分はコンピュータIDについて知る必要はありませんが、Worldと通信するいくつかの部分があります。ネットワークカード。コンピュータIDを知っておく必要があります。

対処方法 - 最適な解決策は何ですか?
返信いただきありがとうございます。

+0

の最終的な変更のためのnetworkDriveオブジェクトに通知するためにオブザーバーパターンを使用することができます

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(); 

は、それはファサードである - それは自然に上昇しています。しかし、これはコードがまだ非常に良いmaintanableと一貫性の問題でなければならない場合、これは複雑です。 IDを変更するとどうなりますか? –

+0

あなたは質問を明確にすることができますので、今は私があなたが何を求めているのか理解できません。ファサードは、サブシステムを使いやすくするための高水準のインタフェースを定義します。 – Gordon

+0

実際には、JavaScriptからjavascriptに変数を持ち込むJavascript :: addVariable()メソッドを持つ静的クラスがあります。ファサードのいくつかの部分は、JavaScriptにいくつかの変数を運ぶ必要がありますが、javascriptではこれらの値をコンピュータに割り当てる必要があります。 –

答えて

1

あなたがこのようなものを知っていると分かったら: 特定のパーツを作成してオブジェクトにプライベートに格納するときは、特定のパーツにcomputerIdを送信する必要があります。 NetworkDriveのように。 その後、必要に応じてcomputerIdを使用できます。あなたは私は知りませんでしたコードのこの部分をコード化された場合computerId

+0

はい、これです。しかし...私は、コンピュータのIDを1つではなく複数のオブジェクトに「格納」してもらえないという気持ちが悪いです。 (一貫性のあるIDの変更など) –

+0

IDの代わりにNetworkCardのComputerインスタンスへのポインタのようなものが必要だと思います。 (私たちは、そのコンピュータがメソッドgetId()を持っていることを前提とすることができます)。 –

+1

コンピュータIDを変更すると、オブザーバパターンを使用して、保存されたコンピュータIDを変更するためにNetworkDriveオブジェクトに通知できます。解決策になることができます。あなたはnetworkDriveの値を変更することができ、それはあまり良くないので、参照を送ることはできません。オブジェクト全体を送信し、必要なものを使用することができます($ this-> networkDrive = new NetworkDrive($ this);)。私はオブザーバーパターン –

関連する問題