美文网首页
观察者模式二

观察者模式二

作者: zjxchase | 来源:发表于2020-03-22 12:51 被阅读0次

简述

有对观察者模式不清楚的朋友请先查看 观察者模式一

本文利用观察者模式设计一个乘客收到火车到站通知上车和下车的场景,利用观察者模式来实现事件处理模型,事件驱动模型是观察者模式的升级

代码示例

事件类

事件类用于封装事件源和事件相关的信息

StationReportingEvent.java

/**
 * 报站通知事件类:用于封装事件源和事件相关的信息
 */
public class StationReportingEvent extends EventObject {

    private static final long serialVersionUID = 1L;

    /**
     * true表示上上车通知,false表示下车通知
     */
    private boolean reportingFlag;

    /**
     * 构造一个原始的事件。
     *
     * @param source 事件源
     * @throws IllegalArgumentException if source is null
     */
    public StationReportingEvent(Object source, boolean reportingFlag) {
        super(source);
        this.reportingFlag = reportingFlag;
    }

    public boolean getReportingFlag() {
        return reportingFlag;
    }

    public void setReportingFlag(boolean reportingFlag) {
        this.reportingFlag = reportingFlag;
    }
}

监听者

接口:TrainEventListener.java

/**
 * 监听者:火车到站通知事件监听者
 */
public interface ITrainEventListener extends EventListener {

    /**
     * 事件处理方法,听到报站通知
     * @param e
     */
    void heardNotice(StationReportingEvent e);
}

监听者实现类(乘客):Passenger.java

/**
 * 乘客:即火车事件的监听者实现类
 */
public class Passenger implements ITrainEventListener {
    /**
     * 乘客姓名
     */
    private String name;

    public Passenger(String name) {
        this.name = name;
    }

    @Override
    public void heardNotice(StationReportingEvent e) {
        TrainEventSource source = (TrainEventSource) e.getSource();
        System.out.println("火车: " + source.getTrainSerialNumber() + "的乘客 :" + this.name + " -> " + (e.getReportingFlag() ? "上车": "下车"));
    }
}

事件源

事件源火车:TrainEventSource.java

/**
 * 事件源:火车
 */
public class TrainEventSource {

    /**
     * 列车编号
     */
    private String trainSerialNumber;

    /**
     * 监听器容器
     */
    private List<ITrainEventListener> listeners;

    public TrainEventSource(String trainSerialNumber) {
        this.trainSerialNumber = trainSerialNumber;
        listeners = new ArrayList<>();
    }

    public String getTrainSerialNumber() {
        return trainSerialNumber;
    }

    public void addListener(ITrainEventListener listener) {
        listeners.add(listener);
    }

    /**
     * 事件触发器:到站通知,触发事件,上车 下车
     * @param flag
     */
    public void stationReporting(boolean flag) {
        System.out.println("火车到站,提醒乘客 " + (flag ? " 上车 " : "下车"));
        notifies(new StationReportingEvent(this, flag));
    }

    public void notifies(StationReportingEvent event) {
        listeners.forEach(l -> {
            l.heardNotice(event);
        });
    }
}

测试类

TrainEventTest.java

public class TrainEventTest {
    public static void main(String[] args) {
        // 事件源:火车
        TrainEventSource source = new TrainEventSource("K154");
        //注册监听器:乘客
        source.addListener(new Passenger("乘客-A"));
        source.addListener(new Passenger("乘客-B"));
        // 上车通知
        source.stationReporting(true);
        System.out.println("-------------------");
        // 下车通知
        source.stationReporting(false);
    }
}

运行结果:

火车到站,提醒乘客  上车 
火车: K154的乘客 :乘客-A -> 上车
火车: K154的乘客 :乘客-B -> 上车
-------------------
火车到站,提醒乘客 下车
火车: K154的乘客 :乘客-A -> 下车
火车: K154的乘客 :乘客-B -> 下车

相关文章

  • 观察者模式

    一、观察者模式介绍 二、观察者模式代码实例

  • 第5章 -行为型模式-观察者模式

    一、观察者模式的简介 二、观察者模式的优缺点 三、观察者模式的实例

  • 3Day:异步编程

    一.观察者模式(发布/订阅) 二.Event 三.观察者模式(Promise/Deferred)

  • 观察者模式_20190912(python)

    一、观察者模式介绍 二、观察者模式UML 三、python实现观察者模式(demo1、2) 1、demo1 """...

  • 观察者模式(Observer )

    对象间的联动——观察者模式(一)对象间的联动——观察者模式(二)对象间的联动——观察者模式(三)对象间的联动——观...

  • 11.9设计模式-观察者模式-详解

    设计模式-观察者模式 观察者模式详解 观察者模式在android中的实际运用 1.观察者模式详解 2.观察者模式在...

  • 观察者模式

    观察者模式 观察者模式的优点 优点1:将观察者与被观察者进行解耦,便于后期二者独立进行功能扩展,不会形成任何的钳制...

  • RxJava基础—观察者模式

    设计模式-观察者模式 观察者模式:观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式...

  • 设计模式之观察者模式

    设计模式之观察者模式 本篇是设计模式系列博客的第四篇,本篇主要学习设计模式中的第二个行为型模式---观察者模式。 ...

  • 前端面试考点之手写系列

    1、观察者模式 观察者模式(基于发布订阅模式) 有观察者,也有被观察者。 观察者需要放到被观察者列表中,被观察者的...

网友评论

      本文标题:观察者模式二

      本文链接:https://www.haomeiwen.com/subject/ifkmyhtx.html