观察者模式概述

发布时间:2023年12月28日

观察者模式,它用于建立一种对象与对象之间的依赖关系,
一个对象发生改变将自动通知其他对象,
其他对象将相应做出反应。在观察者模式种,发生改变的对象称为观察目标,
而被通知的对象称为观察者,一个观察目标可以对应多个观察者,
而且这些观察者之间可以没有任何相互联系,可以根据需要增加和删除观察者,
使得系统易于扩展。

观察者模式(Observer Pattern)定义对象之间的一种一对多依赖关系,
使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。
观察者模式的别名包括发布-订阅模式、模型-试图模式、
源-监听器模式或从属者模式。观察者模式是一种对象行为模式。
Subject(目标):目标又称为主题,
它是指被观察的对象。在目标中定义了一个观察者集合,
一个观察目标可以接受任意数量的观察者来观察,
它提供一系列方法来增加和删除观察者对象,
同时它定义了通知方法notify()。
目标类可以是接口,也可以是抽象类或具体类。

ConcreteSubject(具体目标):
具体目标是目标类的子类,通常它包含又经常发生改变的数据,
当他的状态发生改变时,向它的各个观察者发出通知;
同时它还实现了在目标类中定义的抽象业务逻辑方法
(如果有的话)。如果无需扩展目标类,则具体目标类可以省略。

Observer观察者:
观察者将对观察目标的改变做出反应,
观察者一般定义为接口,改接口声明了更新数据的方法
update(),因此又称为抽象观察者。

ConcreteObserver具体观察者:
在具体观察者中维护一个指向具体目标对象的引用,
它存储具体观察者的有关状态,
这些状态需要和具体目标的状态保持一致。
它实现了在抽象观察者Observer中定义的
update方法。通常在实现时,可以调用具体目标类的
attach方法将自己添加到目标类的集合中或通过detach()
方法将自己从目标类的集合中删除。

观察模式描述了如何建立对象于对象之间的依赖关系,
以及如何构造满足这种需求的系统。
观察者模式包含观察目标和观察者两类对象,
一个目标可以有任意数目的与之相依赖的观察者,
一旦观察目标的状态发生改变,所有的观察者都将得到通知。
作为对这个通知的响应,每个观察者都将监听观察目标的状态
以使其状态与目标状态同步,这个交互也称为发布-订阅。
Publish-Subject。观察目标是通知的发布者。
它发出通知并不需要知道谁是它的观察者,可以有任意数目的观察者订阅
它并接收通知。

public class Main{
    public static void main(String[] args) {
        /*
        观察者模式
         */
        Subject subject = new ConcreteSubject();
        Observer observer1 = new ConcreteObserver1();
        Observer observer2 = new ConcreteObserver2();
        subject.add(observer1);
        subject.add(observer2);
        subject.notifyObserver();
    }

}
public abstract class Subject {
    //定义一个观察集合用于存储所有观察集合。
    protected ArrayList<Observer> observers = new ArrayList<Observer>();
    //protected ArrayList <observers> Observer = new ArrayList<>();
    //向观察集合插入一个观察者
    public void add(Observer observer){
        observers.add(observer);
    }
    //向观察集合删除一个观察者
    public void detach(Observer observer){
        observers.remove(observer);
    }
    //声明抽象通知方法
    public abstract void notifyObserver();

}
public interface Observer {
        public void update();
}
public class ConcreteSubject extends Subject{

    @Override
    public void notifyObserver() {
        // 实现通知方法
        for(Object obs:observers){
            //遍历观察者集合,调用每一个观察者的响应方法
            ((Observer)obs).update();
        }
    }
}
public class ConcreteObserver1 implements Observer{
    @Override
    public void update() {
        System.out.println("具体观察者1作出反应!");
    }
}
public class ConcreteObserver2 implements Observer{
    @Override
    public void update() {
        System.out.println("具体观察者2作出反应!");
    }
}

具体观察者1作出反应!
具体观察者2作出反应!

文章来源:https://blog.csdn.net/wcg_jishuo/article/details/135245636
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。