您当前的位置: 首页 >  Java

止步前行

暂无认证

  • 0浏览

    0关注

    247博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Java设计模式——观察者模式【Observer Pattern】

止步前行 发布时间:2019-05-06 10:19:39 ,浏览量:0

一、引言

下面来介绍一下观察者设计模式。观察者设计模式,顾名思义,肯定要有一个观察者,一个被观察者,而他们之间的关系应当是聚合,即你中有我,我中有你。这样在被观察者改变的时候,观察者才能感知事务被改变,从而得到通知。

二、观察者设计模式

定义一个被观察者:Subject

被观察者中,拥有一个观察者的集合,当对象被改变时,调用观察者集合,做通知处理。

定义一个观察者:Observer

观察者中,拥有被观察者的引用,方便获得被观察者中的具体改变。

1. 被观察者
public class Subject {

	//持有一系列观察者的集合
    private List observers = new ArrayList();

	//被观察者的状态
    private int state;
    public int getState() {
        return this.state;
    }
    public void setState(int state) {
        if (state == this.state) {
            return;
        }
        this.state = state;
        //状态改变时,通知所有的观察者
        notifyAllObserver();
    }

	//添加观察者
    public void attach(Observer observer) {
        observers.add(observer);
    }

	//通知所有的观察者
    private void notifyAllObserver() {
        observers.stream().forEach(Observer::update);
    }
}
2. 观察者的父类
public abstract class Observer {

    protected Subject subject;	// 被观察者
    public Observer(Subject subject) {
        this.subject = subject;
        this.subject.attach(this); // 将自己加入观察者集合中
    }

	//抽象方法,具体实现交给子类,模板方法的运用
    public abstract void update();
}
3. 观察者的具体实现
public class BinaryObserver extends Observer {

    public BinaryObserver(Subject subject) {
        super(subject);
    }

    @Override
    public void update() {
        System.out.println("Binary String:"+ Integer.toBinaryString(subject.getState()));
    }
}
public class OctalObserver extends Observer {

    public OctalObserver(Subject subject) {
        super(subject);
    }

    @Override
    public void update() {
        System.out.println("Octal String:" + Integer.toOctalString(subject.getState()));
    }
}
4. 测试方法
public class ObserverClient {
    public static void main(String[] args) {

        final Subject subject = new Subject();// 被观察者
        new BinaryObserver(subject); // 定义观察者的同时,把自己加入到观察者集合中
        new OctalObserver(subject);
        System.out.println("==================");
        subject.setState(10);
        System.out.println("==================");
        subject.setState(10);
        System.out.println("==================");
        subject.setState(15);
    }
}
5. 输出结果

在这里插入图片描述

三、小结

本文用最通俗的语言介绍了观察者设计模式,鄙人认为比起介绍类图来的更直接,也更容易理解。上面就是观察者设计模式的核心思想。下次使用可以灵活变通。

可能有人会觉得奇怪,为什么要setState(10)两次?这是可以优化的地方,在每次改变之前,比较当前值,不一样再进行改变,在平时的开发中,也可以借鉴。

关注
打赏
1657848381
查看更多评论
立即登录/注册

微信扫码登录

0.0360s