设计模式——观察者模式

本文介绍了观察者模式,包括主题、观察者、具体主题和具体观察者的角色,以及如何通过一个具体的猫、老鼠和主人实例展示如何在Java中使用观察者模式,当猫的状态(大叫)改变时,自动通知并更新依赖的观察者。
摘要由CSDN通过智能技术生成

定义:

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

作用:

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

意义:

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

使用条件:

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

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

主题
  • 主题(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();
    }
}

运行截图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值