美文网首页
观察者模式二

观察者模式二

作者: 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 -> 下车
    

    相关文章

      网友评论

          本文标题:观察者模式二

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