《观察者模式》之“当你凝望深渊时,深渊也在凝望你”

本文介绍设计模式中的观察者模式,通过预约游戏示例演示如何利用该模式实现对象间的解耦通信。重点讲解观察者模式的实现原理及应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

​ 大家好,我是洪爵,今天想给大家讲一下设计模式中的行为型模式观察者模式

​ 什么是行为型模式捏?行为型的设计模式是着重关注于对象之间的通信的。

​ 观察者模式是什么捏?

​ 相信大家或多或少已经接触过观察者模式了,不信?我来给你举个栗子。

​ 比如你点开微博,小红书等等的这些信息流软件,注册之后会让你选择一些标签,让你订阅些感兴趣的标签或内容。这些就属于观察者模式,你点击之后会自动把你和这个标签关联起来,下次打了这个标签的内容就会推送给你,这就是发布-订阅

​ 同样的,我们还是先上代码,再来讲解,让大家有一个思考的过程。这次的例子是预约还没有上线游戏的一个例子,预约后,就能获取到游戏的状态变更

// Game.java
// 抽象游戏类
public abstract class Game {

    // 存放预约游戏的人(称为观察者)
    protected List<Observer> observers = new ArrayList<Observer>();

    // 游戏的状态
    protected int state;

    public int getState() {
        return state;
    }

    // 游戏状态变更, 通知观察者
    public void setState(int state) {
        this.state = state;
        notifyObservers();
    }

    // 增加观察者
    public void addObServer(Observer observer) {
        observers.add(observer);
    }

    // 通知观察者
    public void notifyObservers() {
        for(Observer observer : observers) {
            observer.update();
        }
    }
}
// LOLGame.java
public class LOLGame extends Game {
    // 具体游戏
}
// Observer.java
// 抽象观察者
public abstract class Observer {

    // 通知具体实现
    public abstract void update();

}
// lol游戏的观察者
public class LOLObserver extends Observer {

    // 扩展独有的一些属性
    private String name;
    private String sex;

    public LOLObserver(String name, String sex) {
        this.name = name;
        this.sex = sex;
    }

    @Override
    public void update() {
        System.out.println(this.name + "被通知了");
    }
}

// Client.java
public class Client {
    public static void main(String[] args) {
        // 创建lol手游
        Game lolGame = new LOLGame();
        // 预约游戏的人
        lolGame.addObServer(new LOLObserver("HJH", "male"));
        lolGame.addObServer(new LOLObserver("GCZ", "female"));
        lolGame.addObServer(new LOLObserver("BAT", "male"));

        // lol手游状态变更, 通知预约的人
        lolGame.setState(1);

    }
}
/*console output
HJH被通知了
GCZ被通知了
BAT被通知了
*/

​ 类图
在这里插入图片描述

​ 我们建了两个抽象类,Game和Observer,具体的游戏可以extends Game去拓展,符合开闭原则(对扩展开发,对修改关闭)和依赖倒转原则,针对接口编程,依赖于抽象而不是依赖于具体。

​ Game去维护一个list,这个list可以存储所有观察者的信息,当Game的状态变更的时候,去通知到观察者们,通过一个迭代for循环就能通知完毕

​ 具体的通知方法,需要Observer去实现,对于每一种类的Observer都需要有自己的update实现

​ 观察者模式完美的将观察者和被观察的对象分离开,提高了系统的可维护性重用性。当一个对象的改变需要通知另外的对象的时候,并且我们不需要知道这个对象到底是谁,达到低耦合的状态,就需要使用到观察者模式,因为List存储的是Observer,只要这个类继承自Observer,那么就能加进到这个list中,进入观察中的状态。

​ Java中已经有对观察者模式支持的类,大家可以去看源码:java.util.Observer和java.util.Observable去学习和了解。

​ 今天的观察者模式就到这里啦!

​ 当你凝望深渊时,深渊也在凝望你… …

​ 所以不学好观察者模式,被人凝望都感知不到!多可怕,赶紧行动起来!(胡言胡语)

在这里插入图片描述愿每个人都能带着怀疑的态度去阅读文章并探究其中原理。

道阻且长,往事作序,来日为章。

期待我们下一次相遇!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KnightHONG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值