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

观察者模式(Observer Pattern)是一种软件设计模式,主要用于在对象之间建立一对多的依赖关系,以便当一个对象的状态发生改变时,其所有依赖的对象都会得到通知并自动更新。观察者模式属于行为型模式。以下是关于观察者模式的主要知识点,按照清晰的结构进行归纳:

1. 基本概念

  • 定义:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象状态发生变化时,它的所有依赖者(观察者)都会自动收到通知并更新。
  • 别名:有时又被称为模型(Model)-视图(View)模式、源-收听者(Listener)模式或从属者模式。

2. 特点

  • 松耦合:主题和观察者之间通过抽象接口进行交互,使得它们可以独立演化而不影响彼此。
  • 一对多关系:一个主题可以有多个观察者,并且它们之间没有直接联系。
  • 可扩展性:可以随时增加新的观察者或删除现有观察者。

3. 优点

  • 解耦合:将主题与具体观察者解耦,使得它们可以独立地变化和复用。
  • 扩展性:易于添加新的观察者以及定义新的事件类型。
  • 实时性:实现了实时更新机制,当主题状态改变时能够即刻通知相关观察者。

4. 缺点

  • 性能问题:过度使用可能导致性能问题和复杂度增加。
  • 触发链问题:如果观察者之间有依赖关系,那么通知链可能会导致不可预料的结果。

5. 角色

  • 抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。
  • 具体主题(Concrete Subject):将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。
  • 抽象观察者(Observer):定义了一个更新接口,使得在得到主题的更改通知时更新自己。
  • 具体观察者(Concrete Observer):实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。

6. 应用场景

  • 当一个对象的改变需要同时影响其他多个对象时。
  • 当系统中存在一些对象之间的联动行为,但又希望它们之间解耦合时。
  • 图形用户界面(GUI)的设计中,如按钮点击事件的处理。
  • 消息订阅与发布的场景,如新闻订阅、实时数据监控等。
  • 游戏中升级所触发的一系列动作

7. 实现方式

  • 使用自定义接口:主题和观察者都实现相应接口,在主题中维护一个观察者列表,并在状态改变时遍历通知所有观察者。

8.代码示例

1.定义观察者接口
java 复制代码
public interface Observer {  
    void update(String message);  
}
2.定义被观察者(主题)接口
java 复制代码
import java.util.ArrayList;  
import java.util.List;  
  
public interface Subject {  
    void registerObserver(Observer observer);  
    void removeObserver(Observer observer);  
    void notifyObservers(String message);  
}
3.实现被观察者(主题)
java 复制代码
public class ConcreteSubject implements Subject {  
    private List<Observer> observers;  
    private String state;  
  
    public ConcreteSubject() {  
        this.observers = new ArrayList<>();  
    }  
  
    @Override  
    public void registerObserver(Observer observer) {  
        observers.add(observer);  
    }  
  
    @Override  
    public void removeObserver(Observer observer) {  
        int index = observers.indexOf(observer);  
        if (index >= 0) {  
            observers.remove(index);  
        }  
    }  
  
    @Override  
    public void notifyObservers(String message) {  
        for (Observer observer : observers) {  
            observer.update(message);  
        }  
    }  
  
    // 模拟主题状态改变的方法  
    public void setState(String state) {  
        this.state = state;  
        notifyObservers("主题状态已更改为:" + state);  
    }  
  
    // 获取主题状态的方法(可选)  
    public String getState() {  
        return state;  
    }  
}
4.实现观察者
java 复制代码
public class ConcreteObserver implements Observer {  
    private String name;  
  
    public ConcreteObserver(String name) {  
        this.name = name;  
    }  
  
    @Override  
    public void update(String message) {  
        System.out.println(name + " 收到通知:" + message);  
    }  
}
5.使用
java 复制代码
public class ObserverPatternDemo {  
    public static void main(String[] args) {  
        ConcreteSubject subject = new ConcreteSubject();  
  
        Observer observer1 = new ConcreteObserver("观察者1");  
        Observer observer2 = new ConcreteObserver("观察者2");  
  
        subject.registerObserver(observer1);  
        subject.registerObserver(observer2);  
  
        subject.setState("新状态"); // 这会触发通知,并调用所有观察者的update方法  
  
        subject.removeObserver(observer1); // 移除一个观察者  
  
        subject.setState("另一个新状态"); // 这会再次触发通知,但只通知观察者2  
    }  
}
相关推荐
CodeLinghu2 天前
【设计模式】观察者模式(定义 | 特点 | Demo入门讲解)
windows·观察者模式·设计模式
吕彬-前端3 天前
es6之Proxy实现观察者模式
前端·观察者模式·es6
明戈戈5 天前
设计模式-观察者模式
java·观察者模式·设计模式
捕风捉你7 天前
观察者模式在金融业务中的应用及其框架实现
java·开发语言·观察者模式
杰哥在此7 天前
Java面试题:解释观察者模式的工作原理,并通过实例展示如何在Java中实现
java·开发语言·观察者模式·面试·编程
L_qingting7 天前
C++ 设计模式之观察者模式
c++·观察者模式·设计模式
毕加涛9 天前
设计模式 - Observer Pattern 观察者模式
java·观察者模式·设计模式
milu_ELK10 天前
【Unity设计模式】观察者模式,发布订阅模式,事件总线
观察者模式·unity·设计模式
大莲芒13 天前
设计模式-观察者模式
观察者模式·设计模式
浣花御劍17 天前
【设计模式深度剖析】【7】【行为型】【观察者模式】
java·观察者模式·设计模式