努力保头发的打工人
努力保头发的打工人
发布于 2020-12-30 / 14 阅读 / 0 评论 / 0 点赞

观察者模式

1 概述

定义 观察者模式也叫作发布订阅模式,对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于他的对象都会得到通知并被自动更新。

观察者模式类图.png

  • subject 被观察者一般是抽象类,仅仅完成被观察者的基本实现:管理并通知观察者。

  • concretesubject 具体被观察者,定义自己的业务逻辑,同事定义对那些事件进行通知。

  • observer 观察者,收到消息后进行update方法

  • concreteobserver 具体观察者

2 优缺点

2.1 优点

  • 观察者和被观察者之间是抽象耦合,扩展非常容易java已经实现了抽象级别的定义,java9被定义为过时

  • 建立一套触发机制,观察者可以很好实现一套链条形式。

3 使用场景

  • 关联行为场景。场景可拆分

  • 事情多级触发场景

  • 跨系统的消息交换场景

注意事项:一个类既可以是观察者也可以说被观察者,如果建立通知链较长,逻辑会比较复杂,可维护性变差。

4 代码案例

有三个角色,打工人,老板,hr

/**
 * @author chiangtaol
 * @date 2020-12-08
 * @describe 打工人, 被老板观察者
 */
public class Laborer extends Observable {
​
    public void doSomething(){
        System.out.println("打工人要搞事情了..");
        super.setChanged();
        super.notifyObservers("xxx偷偷摸鱼");
    }
}
​
/**
 * @author chiangtaol
 * @date 2020-12-08
 * @describe 老板
 */
public class Boss extends Observable implements Observer{
​
    @Override
    public void update(Observable o, Object arg) {
        System.out.println("老板获得情报:"+arg);
​
        super.setChanged();
        super.notifyObservers("开除掉xxx...");
    }
}
​
/**
 * @author chiangtaol
 * @date 2020-12-08
 * @describe 人力
 */
public class HR  implements Observer {
​
    @Override
    public void update(Observable o, Object arg) {
        System.out.println("hr接到老板通知:"+arg);
    }
}

测试代码

@Test
void doSomething() {
    Boss boss = new Boss();
    Laborer laborer = new Laborer();
    HR hr = new HR();
    laborer.addObserver(boss);
    boss.addObserver(hr);
    // 打工人摸鱼
    laborer.doSomething();
​
}
​
打工人是被观察者,老板是观察者也是被观察者,hr是观察者,一个短的消息链,执行结果如下:
打工人要搞事情了..
老板获得情报:xxx偷偷摸鱼
hr接到老板通知:开除掉xxx...