趣解设计模式之《同学们,交作业啦!》

〇、小故事

小明学生在学校上完课回家,写完作业后,想要通过微信的方式,把作业提交给老师,但是呢,老师的微信没在线,估计是忙别的去了。

那么,小明就每隔一段时间,看看微信上老师在不在 。当天是情人节,老师和男朋友去看电影吃宵夜,凌晨2点才到家。小明怕作业交不上去,一直等到凌晨2点,才终于等到老师上线,把作业交上去了。这可给小明累坏了。

针对这个问题,老师说了,以后大家不用这样了,你们做完作业就忙自己的事儿吧。如果我打算批作业的话,我会在群里通知大家的,然后你们在把作业给我就可以了。如果我忘记通知大家,这个也不算你们的错误,算老师的哈。同学们从此解脱了。

根据上面的例子我们可以看到,上交作业的行为由老师进行发起,然后在群众的班级同学们就都会收到老师的通知了。如果班级来了新同学或者有哪些同学转校了,只需要添加新同学到班级群中 或者 将转校同学移除班级群即可 ,那么这个模式就是我们今天要介绍的设计模式------观察者模式

一、模式定义

观察者模式Observer Pattern

定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

这里我们也可以采用 的方式,因为的方式,可能会推过来一堆我不需要的信息。那么,当有通知过来,我收到了,我自己再去拉我自己需要的内容。而不是采用你给我什么,我就接收什么。

任何时候,我们都可以增加新的观察者。因为主题唯一依赖的东西是一个实现Observer接口的对象列表,所以我们可以随时增加观察者。观察者模式的故事如下所示:

二、模式类图

针对上面的故事,我们来画一下该模式的类图。首先,创建主题接口类Subject ,该类是用于管理和通知观察者的,其实现类是ConcreteSubject 。然后,我们在创建观察者接口Observer ,以及观察者实现类ConcreteObserver。具体类图如下所示:

三、代码实现

创建观察者接口类Observer.java

java 复制代码
public interface Observer {
    void update();
}

创建观察者实现类1ConcreteObserver1.java

java 复制代码
public class ConcreteObserver1 implements Observer {
    public void update() {
        System.out.println("ConcreteObserver1");
    }
}

创建观察者实现类2ConcreteObserver2.java

java 复制代码
public class ConcreteObserver2 implements Observer {
    public void update() {
        System.out.println("ConcreteObserver2");
    }
}

创建观察者实现类3ConcreteObserver3.java

java 复制代码
public class ConcreteObserver3 implements Observer {
    public void update() {
        System.out.println("ConcreteObserver3");
    }
}

创建主题类Subject.java

java 复制代码
public interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObserver();
}

创建主题实现类ConcreteSubject.java

java 复制代码
public class ConcreteSubject implements Subject {
    private List<Observer> observers;

    public ConcreteSubject() {
        this.observers = new ArrayList<>();
    }

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

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

    public void notifyObserver() {
        observers.forEach(observer -> observer.update());
    }
}

创建测试类OberverTest.java

java 复制代码
public class OberverTest {
    public static void main(String[] args) {
        Observer cObserver1 = new ConcreteObserver1();
        Observer cObserver2 = new ConcreteObserver2();
        Observer cObserver3 = new ConcreteObserver3();
        /** 创建主题 */
        ConcreteSubject subject = new ConcreteSubject();

        /** 注册三个监听者*/
        subject.registerObserver(cObserver1);
        subject.registerObserver(cObserver2);
        subject.registerObserver(cObserver3);

        /** 发送通知 */
        System.out.println("----------给cObserver1、cObserver2、cObserver3发通知----------");
        subject.notifyObserver();

        /** 移除一个监听者ConcreteObserver2*/
        subject.removeObserver(cObserver2);
        System.out.println("----------给cObserver1、cObserver3发通知----------");
        subject.notifyObserver();
    }
}

执行后的结果

java 复制代码
----------给cObserver1、cObserver2、cObserver3发通知----------
ConcreteObserver1
ConcreteObserver2
ConcreteObserver3
----------给cObserver1、cObserver3发通知----------
ConcreteObserver1
ConcreteObserver3

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享

更多技术干货,欢迎大家关注公众号"爪哇缪斯" ~ \(^o^)/ ~ 「干货分享,每天更新」

相关推荐
无名修道院8 分钟前
渗透测试新手面试高频 50 题:原理 + 标准答案(2025)- 第三篇
网络安全·面试·职场和发展·渗透测试·内网渗透·免杀
I'm Jie8 分钟前
告别重复编码!SpringBoot 字段变更(新旧值)日志工具类的规范化设计与优雅实现
java·spring boot·后端
开心猴爷24 分钟前
Bundle Id 创建与管理的工程化方法,一次团队多项目协作中的流程重构
后端
databook25 分钟前
用样本猜总体的秘密武器,4大抽样分布总结
后端·python·数据分析
云雾J视界26 分钟前
深入浅出卷积神经网络(CNN):从LeNet到Vision Transformer的演进及其实战应用
面试·cnn·resnet·transformer·核心竞争力·认知升级·技术细节
CoderYanger1 小时前
动态规划算法-斐波那契数列模型:2.三步问题
开发语言·算法·leetcode·面试·职场和发展·动态规划·1024程序员节
小坏讲微服务1 小时前
SpringBoot4.0整合Scala完整使用
java·开发语言·spring boot·后端·scala·mybatis
泉城老铁1 小时前
windows服务器mysql数据库备份脚本
java·后端·mysql
却尘1 小时前
用 25 个概念彻底看懂SQL多维分析的底层逻辑
后端·sql·mysql