栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

2021/12/24 北京 观察者模式 --出版者+订阅者

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2021/12/24 北京 观察者模式 --出版者+订阅者

举一个最经典的例子:观察者模式 其实就相当于 出版者+订阅者 的关系

当有新闻时,订阅者就会得到来自出版者那边的报纸;当然,若不想订阅报纸,取消订阅即可,之后出版者也就不会再发报纸给你;反之,若想订阅报纸,注册为订阅者即可。


观察者模式的定义:观察者模式定义了对象之间的一对多依赖关系【主题(出版者)与观察者(订阅者)】。主题是真正拥有数据的人,观察者是主题的依赖者。

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

转自:https://segmentfault.com/a/1190000015781946

public interface Updatable {
    void update(Magazine magazine)
}

List readers = new ArrayList();     // 订购杂志的人员列表


public void inform() {
    for (Updatable reader : readers) {
        reader.update(this);
    }
}

转自:四、观察者模式_勇敢牛牛-CSDN博客

// Observer抽象类,扩展了实体Observer的实体类
public abstract class Observer {
    // 把一个类放进抽象类中意义:其实与普通类中放进去道理一样
    public Subject subject;
    // 定义抽象类,由实现类实现
    public abstract void update();
}

主题(出版社),里面有要通知的观察者们,定义为一个List。这些观察者都得有update方法,这样在被通知的时候就能去更新了。怎么保证Observer每一个都有这个方法呢,是不是可以考虑把Observer定义为一个接口,这个接口里写一个update()抽象方法,让每一个观察者去实现这个Observer接口即可。

public class Subject {
    
    private List observers = new ArrayList();
    private int state;
 
    public int getState() {
        return state;
    }
 
    public void setState(int state) {
        this.state = state;
        // 通知所有的观察者,调用notifyall()方法
        notifyAllObservers();
    }
 
    public void add(Observer observer) {
        observers.add(observer);
    }
 
    public void notifyAllObservers() {
        for (Observer observer : observers) {
            // 更新每一个观察者查看的信息
            observer.update();
        }
    }
}

观察者1号:

public class OctalObserver extends Observer {
 
    public OctalObserver(Subject subject) {
        this.subject = subject;
        this.subject.add(this);
    }
 
    @Override
    public void update() {
        System.out.println("Octal String: "
                + Integer.toOctalString(subject.getState()));
    } // Integer.toOctalString()十进制转成八进制
}

观察者2号:

public class HexaObserver extends Observer {
 
    public HexaObserver(Subject subject) {
        this.subject = subject;
        this.subject.add(this);
    }
 
    @Override
    public void update() {
        System.out.println("Hex String: "
                + Integer.toHexString(subject.getState()).toUpperCase());
    }
}
//Integer.toHexString方法返回的字符串表示的无符号整数参数所表示的值以十六进制.

发布者:(观察者模式功能测试)

神奇的地方在于我只是subject.setState(10);把subject它的值改变了,那么来个观察者就会跟着引起改变。

public class ObserverPatternDemo {
    public static void main(String[] args) {
        Subject subject = new Subject();
        new HexaObserver(subject);
        new OctalObserver(subject);
  
        System.out.println("First state change: 15");
        subject.setState(15);
        //First state change: 15
        //Hex String: F
        //Octal String: 17
        System.out.println("Second state change: 10");
        subject.setState(10);
        //Second state change: 10
        //Hex String: A
        //Octal String: 12
    }
}

那 subject.setState(10);是怎么让observer跟着把输出发生了变化呢???

是因为在Subject类中,我们每一次setState的时候都通知了所有的观察者。这时候观察者就能进行update更新语句了。

    public void setState(int state) {
        this.state = state;
        // 通知所有的观察者,调用notifyall()方法
        notifyAllObservers();
    }

    public void notifyAllObservers() {
        for (Observer observer : observers) {
            // 更新每一个观察者查看的信息
            observer.update();
        }
    }

问题出在了这里,我们获取this.subject,再打印this.subject.getState(),这个this.subject是什么时候变了的?当你set一个新的值得时候就变了。(真绕啊)

    public OctalObserver(Subject subject) {
        this.subject = subject;
        this.subject.add(this);
    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/677604.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号