요약: Yii2 이벤트는 "관찰자 모드"를 채택합니다. 관찰자를 먼저 이해한 다음 이벤트를 배우기 쉽습니다.
우선 이름보고 쫄지 말고 내려다보세요 정말 간단해요.
좀 더 고급 정의부터 시작해 보겠습니다. 관찰자 패턴은 일련의 객체 사이의 일대다 관계를 정의합니다. 객체의 상태가 변경되면 다른 종속 항목이 알림을 받게 됩니다.
이해하셨나요?
이해가 되지 않는다면 좀 더 현실적인 것을 생각해보자. 관찰자 모델은 신문을 주문하는 모델이다. 당신과 어떤 사람들은 새로운 신문이 발행되는 한 신문은 그렇게 될 것이다. 신문이 문을 닫지 않는 한 계속 배달될 것 같아요.
물론 구독 취소도 가능합니다.
관찰자 패턴== 신문 + 신문을 주문하는 사람
어떤 정의를 이해하든 한 가지만 기억하세요. "관찰자 패턴"의 가장 멋진 점은 서로 의존하는 일부 클래스를 느슨하게 연결한다는 것입니다. 강제 시스템 같은 건가요? 즉, 각 개체 간의 의존도가 어는점 수준으로 감소하지만 상호 작용은 여전히 가능합니다.
이 시점에서 여러분은 이미 관찰자 패턴을 이해했다고 생각하지만, 언어 기사로서는 코드를 작성하지 않고는 정당화될 수 없습니다. 위의 요구 사항을 달성하기 위해 코드를 사용하겠습니다.
관찰자 패턴을 사용하지 않는 코드부터 시작해 보겠습니다.
class Video { public function new(){ $checkNewVideo = Video::find()->where("xxxxx")->one(); if($checkNewVideo){ // 通知各位 LaoWang::newVideo(); XiaoLi::newVideo(); ChuanPu::newVideo(); ....... // 还有很多很多,比如在给某个集体客户群发、短信发等等等等 } } }// 具体实现$model = new Video(); $model->new();
사실 시스템이 작을 때는 매우 빠르고 효과적인 방법입니다.
그러나 이 방법은 시스템이 커지면 즉시 확장성이 어렵고 오류가 발생하기 쉽다는 문제에 직면하게 됩니다.
예를 들어 Lao Wang이 구독을 원하지 않으면 소스 코드를 변경해야 합니다.
예를 들어 다른 고객이 추가되면 소스 코드를 변경해야 합니다.
예를 들어 xxx의 경우 모두 소스 코드를 변경해야 합니다.
이 두 개체 사이의 결합도가 너무 높습니다.
위의 코드를 먼저 개선해 보겠습니다
/** * 被观察者接口 * 定义了一些公用方法声明,使用观察者模式的类都可以继承此接口 */interface Observable { // 添加/注册观察者 public function attach(Observer $observer); // 删除观察者 public function detach(Observer $observer); // 触发通知 public function notify(); }class Video implements Observable { public $observers = [];// 订阅者 // 添加观察者 public function attach(Observer $observer){ $key = array_search($observer, $this->observers); if ($key === false) { $this->observers[] = $observer; } } // 删除观察者 public function detach(Observer $observer){ $key = array_search($observer, $this->observers); if ($key !== false) { unset($this->observers[$key]); } } // 通知所有观察者 public function notify(){ foreach ($this->observers as $observer) { // 把本类对象传给观察者 $observer->update($this); } } public function new(){ $checkNewVideo = Video::find()->where("xxxxx")->one(); if($checkNewVideo){ $this->notify(); } } }
보시다시피 수정된 코드는 누구에게 전송되는지는 신경 쓰지 않고 모든 관찰자 목록을 반복하여 알려줍니다. 그건 그렇고, 관찰자의 증가나 감소는 이 유형에 아무런 영향을 미치지 않습니다.
对于观察者,数字不定,随时有增减,因此我们定义了一个观察者接口开始抽象它们。
/** * 观察者接口 */interface Observer{ // 接收到通知的处理方法 public function update(Observable $observable); }
老王、小明、川普、冰冰订阅了视频
class LaoWang implements Observer { public function update(Observable $observable){ echo "立刻开始看视频"; } }class XiaoMing implements Observer { public function update(Observable $observable){ echo "收到后忽略通知"; } }class ChuanPu implements Observer { public function update(Observable $observable){ echo "收藏了一下,然后去wc看"; } }class BingBing implements Observer { public function update(Observable $observable){ echo "立刻开始看视频"; } }
具体实现
$model = new Video(); $model->attach(new LaoWang()); $model->attach(new XiaoLi()); $model->attach(new ChuanPu()); $model->attach(new BingBing()); $model->new();
这样当我们再增加一个人加入 习大大 的时候,我们只需要增加一个习大大的观察者类,在实现的时候添加注册,而不需要去改Video类和其他的观察者类,将类之间的耦合降低了很多。
上面就是观察者模式,我们先预想一下我们的事件,假设我们定义了很多观察者代码,他们监听事件的发生,当一个事件被触发,这些观察者都会知道,执行各自的逻辑。
事件就是观察者模式的一种应用。
监听系统的某一个行为,实时获取并执行自己负责的代码。
위 내용은 PHP 디자인 패턴 옵저버 패턴에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!