• Java观察者模式


    观察者模式

    意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

    解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。

    使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。

    关键:在抽象类里有一个 ArrayList 存放观察者们。

     

    优点: 1、观察者和被观察者是抽象耦合的。

        2、建立一套触发机制。

    缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。

                2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。

                3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

    代码示例:

    1、定义观察者抽象类

    /**
     * 观察者模式
     * @author 943567518@qq.com
     *
     */
    public abstract class Observer {
    
        public abstract void update(String msg);
    }

    2、定义多个观察者

    public class Observer1 extends Observer{
    
        @Override
        public void update(String msg) {
            // TODO Auto-generated method stub
            System.out.println(Observer1.class+":"+msg);
        }
    
    }
    public class Observer2 extends Observer{
    
        @Override
        public void update(String msg) {
            // TODO Auto-generated method stub
            System.out.println(Observer2.class+":"+msg);
        }
    
    }
    public class Observer3 extends Observer{
    
        @Override
        public void update(String msg) {
            // TODO Auto-generated method stub
            System.out.println(Observer3.class+":"+msg);
        }
    
    }

    3、定义被观察者

    import java.util.ArrayList;
    import java.util.List;
    /**
     * 观察者模式-被观察者
     * @author 943567518@qq.com
     *
     */
    public class Subject {
        
        private List<Observer> obs=new ArrayList<Observer>();
        
        public void add(Observer ob){
            obs.add(ob);
        }
        
        public void setMsg(String msg){
            for(Observer ob:obs){
                ob.update(msg);
            }
        }
        
        public static void main(String[] args) {
            Observer1 o1=new Observer1();
            Observer2 o2=new Observer2();
            Observer3 o3=new Observer3();
            Subject s=new Subject();
            s.add(o1);
            s.add(o2);
            s.add(o3);
            s.setMsg("信息");
            s.setMsg("改变");
        }
    }
  • 相关阅读:
    python 三大框架的 介绍。
    爬虫之selenium模拟点击
    多线程爬虫爬取详情页HTML
    机器学习三剑客之Matplotlib基本操作
    机器学习三剑客之Pandas中DataFrame基本操作
    机器学习三剑客之Numpy库基本操作
    小功能——快速制作属于自己的个性二维码
    Django 分页器
    Flask 框架中 上下文基础理念,包括cookie,session存储方法,requset属性,current_app模块和g模块
    Flask 框架 重定向,捕获异常,钩子方法及使用jsonify在网页返回json数据
  • 原文地址:https://www.cnblogs.com/xmqa/p/8631372.html
Copyright © 2020-2023  润新知