>  기사  >  백엔드 개발  >  PHP 디자인 패턴 옵저버 패턴에 대한 자세한 설명

PHP 디자인 패턴 옵저버 패턴에 대한 자세한 설명

巴扎黑
巴扎黑원래의
2017-08-17 09:05:131363검색


요약: Yii2 이벤트는 "관찰자 모드"를 채택합니다. 관찰자를 먼저 이해한 다음 이벤트를 배우기 쉽습니다.

뭔데

우선 이름보고 쫄지 말고 내려다보세요 정말 간단해요.

좀 더 고급 정의부터 시작해 보겠습니다. 관찰자 패턴은 일련의 객체 사이의 일대다 관계를 정의합니다. 객체의 상태가 변경되면 다른 종속 항목이 알림을 받게 됩니다.

이해하셨나요?

이해가 되지 않는다면 좀 더 현실적인 것을 생각해보자. 관찰자 모델은 신문을 주문하는 모델이다. 당신과 어떤 사람들은 새로운 신문이 발행되는 한 신문은 그렇게 될 것이다. 신문이 문을 닫지 않는 한 계속 배달될 것 같아요.

물론 구독 취소도 가능합니다.

관찰자 패턴== 신문 + 신문을 주문하는 사람

어떤 정의를 이해하든 한 가지만 기억하세요. "관찰자 패턴"의 가장 멋진 점은 서로 의존하는 일부 클래스를 느슨하게 연결한다는 것입니다. 강제 시스템 같은 건가요? 즉, 각 개체 간의 의존도가 어는점 수준으로 감소하지만 상호 작용은 여전히 ​​가능합니다.

Code it

이 시점에서 여러분은 이미 관찰자 패턴을 이해했다고 생각하지만, 언어 기사로서는 코드를 작성하지 않고는 정당화될 수 없습니다. 위의 요구 사항을 달성하기 위해 코드를 사용하겠습니다.

관찰자 패턴을 사용하지 않는 코드부터 시작해 보겠습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.