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

    观察者模式

    定义:观察者模式(发布-订阅模式),指多个对象之间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都得到通知并被自动更新。

    使用场景:

    • 一个对象的改变会导致其他一个或多个对象的改变
    • 一个对象必须通知其他对象

    结构:

    • 抽象主题(Subject):抽象目标类,它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。
    • 具体主题(Concrete Subject):具体目标类,它实现抽象目标中的通知方法,当具体主题的内部状态发生改变时,通知所有注册过的观察者对象。
    • 抽象观察者(Observer)角色:它是一个抽象类或接口,它包含了一个更新自己的抽象方法,当接到具体主题的更改通知时被调用。
    • 具体观察者(Concrete Observer):实现抽象观察者中定义的抽象方法,以便在得到目标的更改通知时更新自身的状态。

    注意:Java已经实现了观察者模式

    我们利用Java实现的接口,做如下一个例子,我有两个同学,我的手机号修改了,通知到同学去修改。

    例子:

    public class MyInfo extends Observable {
    
        private String telNum;
    
        public String getTelNum() {
            return telNum;
        }
    
        public void setTelNum(String telNum) {
            this.telNum = telNum;
        }
    
        public void updateTelNum(String telNum){
            super.setChanged();
            super.notifyObservers(telNum);
            this.telNum=telNum;
        }
    }
    
    public class Studen1 implements Observer {
    
        @Override
        public void update(Observable o, Object arg) {
            System.out.println("学生1收到了修改信息,改为"+arg);
        }
    }
    
    public class Studen2 implements Observer {
    
        @Override
        public void update(Observable o, Object arg) {
            System.out.println("学生2收到了修改信息,改为"+arg);
        }
    }
    

    测试代码:

    
        public static void main(String[] args) throws InterruptedException, CloneNotSupportedException {
            Observable observable=new MyInfo();
            observable.addObserver(new Studen1());
            observable.addObserver(new Studen2());
    
            ((MyInfo) observable).updateTelNum("12345678");
    
        }
    

    返回目录

    书山有路勤为径,学海无涯苦作舟
  • 相关阅读:
    Web前端浏览器兼容性问题及解决方案
    JS
    vue element-ui 重置样式问题
    学习的一些文章链接
    打开新世界的第一步:学习servlet
    java学习初体验之课后习题
    下载、安装jdk8(Windows下)并配置变量环境
    下载PhpStorm并进行激活
    WCF+NHibernate 序列化
    wcf 证书+ssl+自定义用户名密码
  • 原文地址:https://www.cnblogs.com/javammc/p/14961422.html
Copyright © 2011-2022 走看看