관찰자 패턴이란 무엇인가요? 관찰자 패턴은 객체 간의 일대다 관계를 정의합니다.
관찰자 패턴에는 주체(즉, 관찰자)와 관찰자가 있습니다. 주체는 관찰자에게 알리기 위해 공통 인터페이스를 사용합니다. 주체는 관찰자의 세부 사항을 알지 못하며 관찰자가 주체의 인터페이스를 구현한다는 사실만 알 수 있습니다.
유니버셜 옵저버 모드의 푸시 방식이 더 적합합니다. 아래에서는 날씨 관측소가 인터페이스를 제공하여 각 대시보드에 데이터를 표시합니다.
<?php //使用接口,类必须实现几个功能注册,删除,通知这几个动作 interface Subject{ public function registerObserver(Observer $o); public function removeObserver(Observer $o); public function notifyObservers(); } interface Observer{ public function update($a,$b,$c); } //各个面板不同将改行为以接口实现 interface DisplayElement{ public function display(); } class Weather implements Subject{ public $observers; public $changed=false; public $a; public $b; public $c; public function __construct(){ $this->observers = array(); } public function registerObserver(Observer $o){ $this->observers[] = $o; } public function removeObserver(Observer $o){ $key = array_search($o,$this->observers); if($key!==false){ unset($this->observers[$key]); } } public function notifyObserver(){ if($this->changed){ foreach($this->observer as $ob){ $ob->update($this->a,$this->b,$this->c); } } } public function setChanged(){ $this->changed = true; } //当数值改变时通知各个观察者 public function measurementsChanged(){ $this->setChanged(); $this->notifyObserver(); } public function setMeasurements($a,$b,$c){ $this->a = $a; $this->b = $b; $this->c = $c; $this->measurementsChanged(); } } class CurrentConditionsDisplay implements Observer, DisplayElement{ public $a; public $b; public $c; public $subject; public function __construct(Subject $weather){ $this->subject = $weather; $this->subject->registerObserver($this); } public function update($a,$b,$c){ $this->a = $a; $this->b = $b; $this->c = $c; $this->display(); } public function display(){ echo $this->a.$this->b.$this->c; } } ?>
우리는 느슨하게 결합된 방식으로 이러한 객체들 간에 통신하므로 이후 유지 관리 시 효율성을 크게 향상시킬 수 있습니다.
설계 원칙: 프로그램의 변화하는 측면을 찾아 분리합니다. 구현이 아닌 인터페이스를 위해 프로그램을 사용하고 상속을 줄입니다.
위 내용은 Head First-Observer 모드에 대한 내용을 포함하여 소개되었으며, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.