zoukankan      html  css  js  c++  java
  • 设计模式--6观察者模式

    1.观察者模式(Observer Pattern)
    也叫发布订阅模式,定义对象间一种,一对多的依赖关系,使得当,一个对象状态改变时,所有依赖它的对象都能得到通知,并被自动更新

    2.类图如图


    (1)Subject 被观查者
    定义被观察者必须实现的职责。它必须能够,管理观察者(动态添加或删除观察者),通知观察者。

    (2)ConcreteSubject 具体的被观察者

    (3)Observer 观察者
    接收到消息后,进行update(消息处理)操作

    (4)ConcreteObserver 具体观察者

    3.关键,一个被观察者最好不要同时是观察者,否则这个关系很难维护
    (1)优点:
    观察者和被观察者之间是抽象耦合,方便扩展
    建立一套触发机制,触发链

    (2)观察者模式需要考虑一下开发效率和运行效率问题, 一个被观察者, 多个观察者, 开发
    和调试就会比较复杂, 而且在Java中消息的通知默认是顺序执行, 一个观察者卡壳, 会影响
    整体的执行效率。 在这种情况下, 一般考虑采用异步的方式。

    被观察者发生动作了, 观察者要做出回应, 如果观察者比较多, 而且处理时间比较长怎么办? 那就用异步呗(具体怎么异步)

    代码:

    Observable

    package com.design.观察者模式;
    
    /**
     * 
     * @author yafei.lv
     * 被观察者,要作的通知
     */
    public interface Observable {
        
        void addObserver(Observer observer); //添加观察者
        
        void deleteObserver(Observer observer); //减少观察者
        
        void notifyObservers(String context);
    }

    ObservableMotion

    package com.design.观察者模式;
    
    /**
     * 
     * @author yafei.lv
     * 被观察者,要做的动作
     */
    public interface ObservableMotion {
        
        void haveBreakFast(); // 吃饭
        
        void haveFun(); // 娱乐
    }

    ObservableImpl

    package com.design.观察者模式;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 
     * @author yafei.lv
     * 被观察者实现
     */
    public class ObservableImpl implements Observable,ObservableMotion {
        
        public List<Observer> observers = new ArrayList<Observer>(); // 观察者列表
        
        
        @Override
        public void haveBreakFast() {
            notifyObservers("开始吃饭....");
        }
    
        @Override
        public void haveFun() {
            notifyObservers("开始娱乐....");
        }
    
        @Override
        public void addObserver(Observer observer) {
            observers.add(observer);
        }
    
        @Override
        public void deleteObserver(Observer observer) {
            observers.remove(observer);
        }
    
        @Override
        public void notifyObservers(String context) {
            for(Observer observer : observers){
                observer.update(context);
            }
        }
    
    }

    Observer

    package com.design.观察者模式;
    
    /**
     * 
     * @author yafei.lv
     * 观察者
     */
    public interface Observer {
        void update(String context);
    }

    ObserverLiSi

    package com.design.观察者模式;
    
    public class ObserverLiSi implements Observer{
    
        @Override
        public void update(String context) {
             System.out.println("观察者李斯,报告,被监控者有了活动:" + context);
        }
    
    }

    ObserverZhaogao

    package com.design.观察者模式;
    
    public class ObserverZhaogao implements Observer{
    
        @Override
        public void update(String context) {
             System.out.println("观察者赵高,报告,被监控者有了活动:" + context);
             System.out.println("所以我也开始吃饭,赵高");
        }
    
    }

    场景类:

    package com.design.观察者模式;
    
    /**
     * 
     * @author yafei.lv
     * 场景类
     */
    public class Main {
        public static void main(String[] args) {
            Observer observerLisi = new ObserverLiSi();
            Observer observerZhaogao = new ObserverZhaogao();
            
            ObservableImpl observable = new ObservableImpl();
            observable.observers.add(observerZhaogao);
            observable.observers.add(observerLisi);
            
            observable.haveBreakFast();
            observable.haveFun();
        }
    }
  • 相关阅读:
    如何開始深度學習?
    ckeditor 使用手册
    js 跨域的使用
    关于mysql中数据存储复合树形结构,查询时结果按树形结构输出
    关于tomcat的远程调试
    关于cookie的使用
    关于跨域
    去除除服串中的某些字符,不用String内置方法
    POI导入数据
    onbeforepaste
  • 原文地址:https://www.cnblogs.com/fubaizhaizhuren/p/5956548.html
Copyright © 2011-2022 走看看