设计模式——观察者模式

定义:

定义一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。

作用:

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

意义:

一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。

使用条件:

一个对象的状态发生改变,所有的依赖对象都将得到通知,进行通知。

观察者模式包含以下几个核心角色:

主题
  • 主题(Subject):也称为被观察者或可观察者,它是具有状态的对象,并维护着一个观察者列表。主题提供了添加、删除和通知观察者的方法。
观察者
  • 观察者(Observer):观察者是接收主题通知的对象。观察者需要实现一个更新方法,当收到主题的通知时,调用该方法进行更新操作。
具体主题
  • 具体主题(Concrete Subject):具体主题是主题的具体实现类。它维护着观察者列表,并在状态发生改变时通知观察者。
具体观察者
  • 具体观察者(Concrete Observer):具体观察者是观察者的具体实现类。它实现了更新方法,定义了在收到主题通知时需要执行的具体操作。

示例及代码:

猫大叫一声,所有老鼠都开始逃跑,主人被惊醒。

import java.util.ArrayList;
import java.util.List;

// 主题接口
interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers();
}

// 观察者接口
interface Observer {
    void update();
}

// 具体主题实现类:猫
class Cat implements Subject {
    private List<Observer> observers = new ArrayList<>();

    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update();
        }
    }

    // 猫大叫
    public void meow() {
        System.out.println("猫大叫一声!");
        notifyObservers();
    }
}

// 具体观察者实现类:老鼠
class Mouse implements Observer {
    @Override
    public void update() {
        System.out.println("老鼠开始逃跑!");
    }
}

// 具体观察者实现类:主人
class Owner implements Observer {
    @Override
    public void update() {
        System.out.println("主人被惊醒!");
    }
}

public class Main {
    public static void main(String[] args) {
        // 创建主题对象:猫
        Cat cat = new Cat();

        // 创建具体观察者对象:老鼠
        Mouse mouse1 = new Mouse();
        Mouse mouse2 = new Mouse();

        // 注册观察者:老鼠
        cat.registerObserver(mouse1);
        cat.registerObserver(mouse2);

        // 创建具体观察者对象:主人
        Owner owner = new Owner();

        // 注册观察者:主人
        cat.registerObserver(owner);

        // 猫大叫,触发通知
        cat.meow();
    }
}

运行截图

相关推荐

  1. 设计模式观察模式

    2024-02-21 07:02:02       39 阅读
  2. 设计模式观察模式

    2024-02-21 07:02:02       33 阅读
  3. 设计模式——观察模式

    2024-02-21 07:02:02       22 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-21 07:02:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-21 07:02:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-21 07:02:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-21 07:02:02       18 阅读

热门阅读

  1. spark sql 的join调优

    2024-02-21 07:02:02       28 阅读
  2. 基于opencv的SIFT特征提取

    2024-02-21 07:02:02       28 阅读
  3. NPM运行保存问题解决

    2024-02-21 07:02:02       27 阅读
  4. 整型数组按个位值排序/最低位排序(C语言)

    2024-02-21 07:02:02       33 阅读
  5. k8s集群5个故障案例分析

    2024-02-21 07:02:02       32 阅读
  6. 【npm】常见错误

    2024-02-21 07:02:02       28 阅读