zoukankan      html  css  js  c++  java
  • java23种设计模式-行为型模式-观察者模式

    一、定义

    观察者模式中,一个被观察者管理所有相依于它的观察者物件,并且在本身的状态改变时主动发出通知。这通常通过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。

    二、优点及缺点

    优点:

    1、观察者和被观察者之间是抽象耦合,容易扩展观察者。

    2、可以建立一套触发机制。

    缺点:

    1、观察者较多时,容易造成阻塞,因此可以采用异步的方式通知。

    三、代码实现:

     抽象观察者:

    package com.example.demo.sjms.guanchazhemoshi;
    
    /**
     *  @Author: caesar
     *  @Date:2020年11月24日 08:11:15
     *  @Description: 抽象观察者
     */
    public interface Watcher {
        public void update();
    }

    具体观察者:

    package com.example.demo.sjms.guanchazhemoshi;
    
    /**
     *  @Author: caesar
     *  @Date:2020年11月24日 08:11:58
     *  @Description: 具体观察者
     */
    public class Student implements Watcher{
        @Override
        public void update() {
            System.out.println("老师,下课啦,放学回家!!!");
        }
    }
    package com.example.demo.sjms.guanchazhemoshi;
    
    /**
     *  @Author: caesar
     *  @Date:2020年11月24日 08:11:06
     *  @Description: 具体观察者
     */
    public class Teacher implements Watcher{
        @Override
        public void update() {
            System.out.println("同学们,下课啦,放学回家吧!!!");
        }
    }

    抽象被观察者:

    package com.example.demo.sjms.guanchazhemoshi;
    
    import java.util.List;
    
    /**
     *  @Author: caesar
     *  @Date:2020年11月24日 08:11:03
     *  @Description: 抽象被观察者
     */
    public interface Watched {
        /**
         *  @Author: caesar
         *  @Date:2020年11月24日 08:11:44
         *  @Description: 添加观察者
         */
        public void addWatcher(Watcher watcher);
        /**
         *  @Author: caesar
         *  @Date:2020年11月24日 08:11:20
         *  @Description: 删除观察者
         */
        public void removeWatcher(Watcher watcher);
        /**
         *  @Author: caesar
         *  @Date:2020年11月24日 08:11:29
         *  @Description: 通知观察者
         */
        public void updateWatcher();
    }

    具体被观察者:

    package com.example.demo.sjms.guanchazhemoshi;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     *  @Author: caesar
     *  @Date:2020年11月24日 08:11:26
     *  @Description: 课程
     */
    public class Class implements Watched{
        private List<Watcher> watcherList;
        public Class(){
            watcherList = new ArrayList<Watcher>();
        }
    
        /**
         *  @Author: caesar
         *  @Date:2020年11月24日 08:11:44
         *  @Description: 添加观察者
         */
        @Override
        public void addWatcher(Watcher watcher) {
            watcherList.add(watcher);
        }
    
        /**
         *  @Author: caesar
         *  @Date:2020年11月24日 08:11:20
         *  @Description: 删除观察者
         */
        @Override
        public void removeWatcher(Watcher watcher) {
            watcherList.add(watcher);
        }
    
        /**
         *  @Author: caesar
         *  @Date:2020年11月24日 08:11:29
         *  @Description: 通知观察者
         */
        @Override
        public void updateWatcher() {
            watcherList.forEach(x -> {
                x.update();
            });
        }
    }

    测试类:

    package com.example.demo.sjms.guanchazhemoshi;
    
    /**
     *  @Author: caesar
     *  @Date:2020年11月24日 08:11:20
     *  @Description: 测试类
     */
    public class Test {
        public static void main(String[] args) {
            Teacher teacher = new Teacher();
            Student student = new Student();
            Class clazz = new Class();
            clazz.addWatcher(teacher);
            clazz.addWatcher(student);
            // 开始通知
            clazz.updateWatcher();
        }
    }

    四、源码级别

    五、总结

    使用场景:对象间存在一对多关系,一个对象的状态发生改变会影响其他对象。

  • 相关阅读:
    随机森林算法
    读论文《BP改进算法在哮喘症状-证型分类预测中的应用》
    Spss22安装与破解步骤
    python安装pip、numpy、scipy、statsmodels、pandas、matplotlib等
    windows下Python三步安装pip
    LNMP环境下配置PHP错误信息提示
    SAE临时文件读写例子 SAE_TMP_PATH
    新浪sae 微信公众平台 输出 返回 打印对象
    PHP 易混 知识
    thinkphp tp5 模板文件 循环输出 bootstrap 模态框 弹窗 获取 微信媒体文件素材 media_id
  • 原文地址:https://www.cnblogs.com/mcjhcnblogs/p/14028492.html
Copyright © 2011-2022 走看看