观察者模式实例

公司中,当老板不在的时候,大家都免不了偷个懒,比如女同事逛逛淘宝男同事看个篮球比赛但是如果老板突然回来,发现自己没有工作,这种情况就比较尴尬!正在大家为此事上头时,前台王小姐说:“当老板回来时,她会打电话通知大家!”。这样大家就可以放心的偷懒了。——这种情况就可以抽象的理解为观察者模式。前台秘书处负责传递消息,办公室内每个员工都是观察者,当有情况发生时,秘书处会将信息发送至每个观察者,确保不会尴尬!


<?php
header("content-type:text/html;charset=utf-8");
#===================定义观察者、被观察者接口============

interface ITicketObserver //观察者接口

{

    function onBuyTicketOver($sender,$args); //得到通知后调用的方法

}


interface ITicketObservable //被观察对象接口

{

    function addObserver($observer); //提供注册观察者方法

}

#====================主题类实现========================

class Reception implements ITicketObservable { //实现主题接口(被观察者)

    private $_observers = array (); //通知数组(观察者)

     public function buyTicket($ticket) 

	{       
       //循环通知,调用其onBuyTicketOver实现不同业务逻辑

       foreach ( $this->_observers as $obs )

            $obs->onBuyTicketOver ( $this, $ticket ); //$this 可用来获取主题类句柄,在通知中使用

       }

     //添加通知
     public function addObserver($observer) //添加N个通知
 
  	 {

        $this->_observers [] = $observer;

    }

}

 

#=========================定义多个通知====================

//男同事通知

class NoticeMan implements ITicketObserver {

    public function onBuyTicketOver($sender, $ticket) {

       echo (date ( 'Y-m-d H:i:s' ) . " 男同事收到消息:$ticket<br>");

    }

}

//女同事通知
class NoticeWoman implements ITicketObserver {

    public function onBuyTicketOver($sender, $ticket) {

       echo (date ( 'Y-m-d H:i:s' ) . " 女同事收到消息:$ticket<br>");

    }

}


$secretary = new Reception();

$secretary->addObserver ( new NoticeMan() );

$secretary->addObserver ( new NoticeWoman () );

//秘书
$secretary->buyTicket ( "老板回来了" );

观察者模式是一种行为设计模式,它允许一个对象在其状态发生改变时向其他多个对象发出通知。以下是一个简单的观察者模式实例: 假设我们正在开发一个气象站应用程序,该应用程序需要实时显示当前温度、气压和湿度。我们可以使用观察者模式来实现这个应用程序。在这个应用程序中,气象站是主题,而显示当前气象数据的应用程序是观察者。 首先,我们需要定义一个主题接口,该接口包含注册观察者、删除观察者和通知观察者的方法。代码如下所示: ```java public interface Subject { public void registerObserver(Observer o); public void removeObserver(Observer o); public void notifyObservers(); } ``` 然后,我们需要定义一个观察者接口,该接口包含更新气象数据的方法。代码如下所示: ```java public interface Observer { public void update(float temperature, float pressure, float humidity); } ``` 接下来,我们需要实现具体的主题类,该类维护一个观察者列表,并在气象数据发生变化时通知观察者。代码如下所示: ```java import java.util.ArrayList; public class WeatherData implements Subject { private ArrayList<Observer> observers; private float temperature; private float pressure; private float humidity; public WeatherData() { observers = new ArrayList<Observer>(); } public void registerObserver(Observer o) { observers.add(o); } public void removeObserver(Observer o) { int i = observers.indexOf(o); if (i >= 0) { observers.remove(i); } } public void notifyObservers() { for (Observer observer : observers) { observer.update(temperature, pressure, humidity); } } public void measurementsChanged() { notifyObservers(); } public void setMeasurements(float temperature, float pressure, float humidity) { this.temperature = temperature; this.pressure = pressure; this.humidity = humidity; measurementsChanged(); } } ``` 最后,我们需要实现具体的观察者类,该类在气象数据发生变化时更新显示。代码如下所示: ```java public class CurrentConditionsDisplay implements Observer { private float temperature; private float pressure; private float humidity; public void update(float temperature, float pressure, float humidity) { this.temperature = temperature; this.pressure = pressure; this.humidity = humidity; display(); } public void display() { System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity"); } } ``` 现在,我们可以创建一个 WeatherData 对象作为主题,并创建一个 CurrentConditionsDisplay 对象作为观察者。然后,我们可以调用 WeatherData 对象的 setMeasurements() 方法来更新气象数据,并自动通知观察者。代码如下所示: ```java public class WeatherStation { public static void main(String[] args) { WeatherData weatherData = new WeatherData(); CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(); weatherData.registerObserver(currentDisplay); weatherData.setMeasurements(80, 65, 30.4f); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值