[01][01][10] 观察者模式详解

1. 定义

观察者模式定义了对象之间的一对多依赖,让多个观察者对象同时监听一个主体对象,当主体对象发生变化时,它的所有依赖者(观察者)都会收到通知并更新

观察者模式有时也叫做发布订阅模式

2. 适用场景

观察者模式只要用于在关联行为之间建立一套触发机制的场景

3. 代码实现

3.1 被观察者类

package com.zhunongyun.toalibaba.designpatterns.observer.jdk;


import lombok.Data;

import java.util.Observable;

@Data
public class Blog extends Observable {

    private String name = "问题回答博客";

    private static Blog blog = new Blog();

    private Blog() {}

    public static Blog getInstance() {
        return blog;
    }

    public void publishQuestion (Questtion question) {
        System.out.println(question.getUserName() + "在" + this.name + "上提交了一个问题");
        super.setChanged();
        super.notifyObservers(question);
    }
}
package com.zhunongyun.toalibaba.designpatterns.observer.jdk;

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class Questtion {
    /**
     * 提问人
     */
    private String userName;
    /**
     * 问题内容
     */
    private String context;
}

3.2 观察者类

package com.zhunongyun.toalibaba.designpatterns.observer.jdk;

import lombok.AllArgsConstructor;
import lombok.Data;

import java.util.Observable;
import java.util.Observer;

@Data
@AllArgsConstructor
public class Teacher implements Observer {

    private String name;

    @Override
    public void update(Observable o, Object arg) {
        Blog blog = (Blog) o;
        Questtion questtion = (Questtion) arg;

        System.out.println("================================");
        System.out.println(name + "老师, 你好! \n" + "你收到一个来着\""
                + blog.getName() + "\"的提问,希望您解答,问题内容如下: \n"
                + questtion.getContext() + "\n" + "提问者:" + questtion.getUserName());
    }
}

3.3 测试类

package com.zhunongyun.toalibaba.designpatterns.observer.jdk;

public class JDKObserverTest {
    public static void main(String[] args) {
        Blog blog = Blog.getInstance();
        Teacher teacher1 = new Teacher("李四");
        Teacher teacher2 = new Teacher("王五");
        Questtion questtion = new Questtion("小明", "观察者模式的原理是什么?");

        blog.addObserver(teacher1);
        blog.addObserver(teacher2);
        blog.publishQuestion(questtion);
    }
}

4. 源码解读

4.1 Spring的ContextLoaderListener

public class ContextLoaderListener extends ContextLoader implements ServletContextListener {

}

5. 优缺点

5.1 优点

  • 观察者与被观察者之间建立了一个抽象的耦合
  • 观察者模式支持广播通信

5.2 缺点

  • 观察者之间有过多的细节依赖,提高时间消耗及程序的复杂度
  • 使用要得当,要避免循环调用
发布了29 篇原创文章 · 获赞 10 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/csharpqiuqiu/article/details/100057224
今日推荐