yechuan 的个人博客

记录精彩的程序人生

  menu
6 文章
0 浏览
0 当前访客
ღゝ◡╹)ノ❤️

观察者设计模式

观察者设计模式

说明

  • 观察者模式也称作监听模式,即观察与被观察的关系,比如你在烧开水时看它有没有开,你就是观察者,水就是被观察者。观察者模式是指对象之间一对多的依赖关系,每当那个被观察者改变状态时,所有依赖于它的观察者都会得到通知并被自动更新
  • 观察者模式是对象的行为模式。有的地方称作的发布-订阅模式、模型-视图模式、源-监听器模式、从属者模式等,当你看到这种叫法时,不要觉得陌生,它们都是观察者模式。
  • 观察者模式可以有任意多个观察者对象同时监听某一个对象。监听某个对象的叫观察者(Observer),被监听的对象叫被观察者(Subject) 。被观察者对象在内容或状态发生改变时,会通知所有观察者,使它们能自动更新自己的信息。

架构

  • Observer:所有的观察者接口
    • update方法即为观察者收到通知自动更新
  • Subject:被观察者接口
    • update方法为被观察者更新
    • addObserver方法为添加新的观察者
    • delObserver方法为移除某个观察者

具体代码实现

  • 观察者A
public class ObserverImplA implements Observer{
        @Override
        public void update(Subject subject) {
            System.out.println("观察者A执行");
        }
	}
  • 观察者B
public class ObserverImplB implements Observer{
        @Override
        public void update(Subject subject) {
            System.out.println("观察者B执行");
        }
	}
  • 被观察者
public class SubjectImpl implements Subject {

        private List<Observer> observers;

        @Override
        public void update() {
            System.out.println("被观察者执行");
            if (observers == null) {
                return;
            }
            for (Observer observer : observers) {
                observer.update(this);
            }
        }

        @Override
        public void addObserver(Observer observer) {
            if (observers == null) {
                observers = new LinkedList<>();
            }
            observers.add(observer);
        }

        @Override
        public void delObserver(Observer observer) {
            if (observers == null || observers.isEmpty()) {
                return;
            }
            observers.remove(observer);
        }
}
  • 运行
public static void main(String[] args) {
        final Subject subject = new SubjectImpl();
        // 新增两个观察者
        subject.addObserver(new ObserverImplA());
        subject.addObserver(new ObserverImplB());
        // 修改被观察者
        subject.update();
        // 被观察者发生变化时,两个观察者也会一同发生变化
    }

标题:观察者设计模式
作者:yechuan
地址:http://yechuan.top:8888/articles/2021/10/19/1634651001616.html