下面就详细讲解一下“PHP观察者模式原理与简单实现方法示例”的完整攻略。
什么是观察者模式?
观察者模式是一种软件设计模式,通过定义一种一对多的依赖关系,以便于多个对象同时处理某一个任务。在该模式中,一个被观察的主题(即可观察者)维护一组观察者集合,它们依赖于该主题。当主题状态发生改变时,它会自动通知观察者们,使得它们能够自动更新自己的状态。
观察者模式的实现原理
观察者模式的实现原理可以用以下3个角色来进行描述:
- Subject(主题): 它是被观察的对象,它可以有多个观察者,并且提供对观察者的注册和删除等操作,同时它必须定义一个接口让观察者能够进行状态更新。
- Observer(观察者): 它是观察Subject的对象,当Subject的状态被修改时,Observer将获得通知并进行相应的处理。
- ConcreteSubject(具体主题): 它是具体被观察的对象,它实现了Subject接口,它发送通知以更改观察者的状态。
- ConcreteObserver(具体观察者): 它是具体的观察者对象,实现了Observer接口,以便通过Subject接收通知实时更新自己的状态。
PHP观察者模式示例1
下面我们来看一个简单的示例来说明PHP中观察者模式的实现。
Subject主题类的实现
class Subject
{
private $observers = array();
private $state;
// 添加观察者
public function attach(Observer $observer)
{
array_push($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();
}
}
// 设置状态
public function setState($state)
{
$this->state = $state;
$this->notify();
}
// 获取状态
public function getState()
{
return $this->state;
}
}
Observer观察者类的实现
interface Observer
{
public function update();
}
class ConcreteObserver1 implements Observer
{
public function update()
{
echo "ConcreteObserver1 has been notified.\n";
}
}
class ConcreteObserver2 implements Observer
{
public function update()
{
echo "ConcreteObserver2 has been notified.\n";
}
}
客户端代码的实现
$subject = new Subject();
$observer1 = new ConcreteObserver1();
$observer2 = new ConcreteObserver2();
$subject->attach($observer1);
$subject->attach($observer2);
$subject->setState('STATE1');
$subject->setState('STATE2');
$subject->detach($observer2);
$subject->setState('STATE3');
输出结果:
ConcreteObserver1 has been notified.
ConcreteObserver2 has been notified.
ConcreteObserver1 has been notified.
ConcreteObserver2 has been notified.
ConcreteObserver1 has been notified.
PHP观察者模式示例2
下面我们再来看另一个示例,这个示例将更直观地展示观察者模式的用法。
Subject主题类的实现
class User
{
private $email;
private $observers = array();
// 添加观察者
public function attach(Observer $observer)
{
array_push($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);
}
}
// 设置email并通知观察者
public function setEmail($email)
{
$this->email = $email;
$this->notify();
}
// 获取email
public function getEmail()
{
return $this->email;
}
}
Observer观察者类的实现
interface Observer
{
public function update(User $user);
}
class EmailSender implements Observer
{
public function update(User $user)
{
$email = $user->getEmail();
echo "Sending email to: {$email}\n";
}
}
class UserLogger implements Observer
{
public function update(User $user)
{
$email = $user->getEmail();
echo "User email changed: {$email}\n";
}
}
客户端代码的实现
$user = new User();
$emailSender = new EmailSender();
$userLogger = new UserLogger();
$user->attach($emailSender);
$user->attach($userLogger);
$user->setEmail('example@mail.com');
$user->detach($userLogger);
$user->setEmail('new_example@mail.com');
输出结果:
Sending email to: example@mail.com
User email changed: example@mail.com
Sending email to: new_example@mail.com
以上就是PHP观察者模式原理与简单实现方法示例的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP观察者模式原理与简单实现方法示例 - Python技术站