设计模式之观察者模式讲解

概念:定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。

  • 抽象主题:或者叫被观察者,可以持有、增加、删除观察者对象。
  • 具体主题:实现抽象主题定义的操作,并定义一个状态,每当状态改变时,通知所有观察者。
  • 抽象观察者:为所有观察者定义抽象操作,如update()方法,用于接收具体主题的状态变化。
  • 具体观察者:具体实现接收到状态变化后的逻辑。

用一个例子帮助大家理解:

public interface Observer {
    void update(String message);
}

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);
    }
}

public interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers(String message);
}

public class ConcreteSubject implements Subject {
    private List<Observer> observers = new ArrayList<>();
    private String state;
    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }
    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }
    @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;
    }
}

public class Demo {
    public static void main(String[] args) {
        ConcreteSubject subject = new ConcreteSubject();
        Observer observer1 = new ConcreteObserver("Observer 1");
        Observer observer2 = new ConcreteObserver("Observer 2");
        subject.registerObserver(observer1);
        subject.registerObserver(observer2);
        subject.setState("Start");
        subject.setState("Processing");
        subject.removeObserver(observer1);
        subject.setState("Stop");
    }
}

如果大家需要视频版本的讲解,欢迎大家关注我的B站:

【天哥不爱学习的个人空间-哔哩哔哩】 https://b23.tv/HxwqjXl

相关推荐

  1. 【前端设计模式观察模式

    2024-04-09 06:54:04       56 阅读
  2. 设计模式观察模式

    2024-04-09 06:54:04       55 阅读
  3. 设计模式观察模式

    2024-04-09 06:54:04       56 阅读
  4. 设计模式观察模式

    2024-04-09 06:54:04       53 阅读
  5. go 设计模式观察模式

    2024-04-09 06:54:04       52 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-09 06:54:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-09 06:54:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-09 06:54:04       82 阅读
  4. Python语言-面向对象

    2024-04-09 06:54:04       91 阅读

热门阅读

  1. 力扣经典150题第十题:跳跃游戏二

    2024-04-09 06:54:04       37 阅读
  2. FPN网络

    FPN网络

    2024-04-09 06:54:04      33 阅读
  3. 「PHP系列」PHP 函数详解

    2024-04-09 06:54:04       37 阅读
  4. TypeScript尚硅谷学习

    2024-04-09 06:54:04       29 阅读
  5. Yocto - 如何给配方文件添加源码patch

    2024-04-09 06:54:04       32 阅读
  6. 【分布式】MIT 6.824 Lab 2C实现细节分析

    2024-04-09 06:54:04       35 阅读
  7. CV2不同图像插值方式的区别

    2024-04-09 06:54:04       30 阅读