11.行为型 - 观察者模式 (Observer)

1.定义

  • 定义被观察者与观察者之间的一对多关系,使得Subject改变时,Observers都被通知到
  • 使用较多,如数据库监听、发布-订阅系统

2.UML类图

在这里插入图片描述

  • 角色介绍
    ISubject : 抽象被观察者
    ConcreteSubject : 具体被观察者
    IObserver : 抽象观察者
    ConcreteObserverA : 具体观察者,观察Subject的变化
    ConcreteObserverB : 具体观察者
  • 要点
    被观察者持有抽象观察者的引用

3.UML示例代码

/**
 * Copyright (C), 2016-2020
 * FileName: IObserver
 * Author: wei.zheng
 * Date: 2019/12/16 9:22
 * Description: 抽象观察者接口
 */
public interface IObserver {
    void update(String content);
}
/**
 * Copyright (C), 2016-2020
 * FileName: ConcreteObserverA
 * Author: wei.zheng
 * Date: 2019/12/16 9:24
 * Description: 具体观察者A
 */
public class ConcreteObserverA implements IObserver {
    @Override
    public void update(String content) {
        System.out.println("ConcreteObserverA receive update: " + content);
    }
}
/**
 * Copyright (C), 2016-2020
 * FileName: ConcreteObserverB
 * Author: wei.zheng
 * Date: 2019/12/16 9:24
 * Description: 具体观察者B
 */
public class ConcreteObserverB implements IObserver {
    @Override
    public void update(String content) {
        System.out.println("ConcreteObserverB receive update: " + content);
    }
}
/**
 * Copyright (C), 2016-2020
 * FileName: ISubject
 * Author: wei.zheng
 * Date: 2019/12/16 9:26
 * Description: 抽象被观察者接口
 */
public interface ISubject {
    void notifyObservers();
}
/**
 * Copyright (C), 2016-2020
 * FileName: ConcreteSubject
 * Author: wei.zheng
 * Date: 2019/12/16 9:27
 * Description: 具体被观察者, 模拟改变状态,通知各个观察者
 */
public class ConcreteSubject implements ISubject {
    private List<IObserver> observerList = new ArrayList<>();

    private String state;

    public void setState(String state) {
        this.state = state;
    }

    public void attach(IObserver observer) {
        this.observerList.add(observer);
    }

    @Override
    public void notifyObservers() {
        for (IObserver observer : observerList) {
            observer.update("state changed to " + state);
        }
    }
}
/**
 * Copyright (C), 2016-2020
 * FileName: Client
 * Author: wei.zheng
 * Date: 2019/12/16 9:30
 * Description: 观察者模式用户类
 */
public class Client {
    public static void main(String[] args) {
        ConcreteSubject subject = new ConcreteSubject();

        IObserver observerA = new ConcreteObserverA();
        IObserver observerB = new ConcreteObserverB();

        subject.attach(observerA);
        subject.attach(observerB);

        // 被观察者Subject改变内部状态,通知到各个观察者Observer
        subject.setState("Active");
        subject.notifyObservers();
    }
}
// 运行结果
2019-12-16 09:38:10.203 15870-15870/com.example.observer I/System.out: ConcreteObserverA receive update: state changed to Active
2019-12-16 09:38:10.203 15870-15870/com.example.observer I/System.out: ConcreteObserverB receive update: state changed to Active

4.总结

  • 优缺点
    优点:将被观察者与观察者之间完全解耦(或者叫抽象耦合),应用较为广泛;
    缺点:当观察者较多时,注意执行效率,适当采用异步的通知方式。
发布了37 篇原创文章 · 获赞 0 · 访问量 572

猜你喜欢

转载自blog.csdn.net/qq_37514242/article/details/103557390