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

〇、小故事

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

那么,小明就每隔一段时间,看看微信上老师在不在 。当天是情人节,老师和男朋友去看电影吃宵夜,凌晨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^)/ ~ 「干货分享,每天更新」

相关推荐
yinke小琪几秒前
面试官:谈谈为什么要拆分数据库?有哪些方法?
java·后端·面试
用户298698530142 分钟前
C# 中 Excel 工作表打印前页面边距的设置方法
后端·.net
自由的疯3 分钟前
java DWG文件转图片
java·后端·架构
ServBay9 分钟前
Rust 1.89更新,有哪些值得关注的新功能
后端·rust
程序员小假10 分钟前
请介绍类加载过程,什么是双亲委派模型?
java·后端
汤姆yu24 分钟前
基于springboot的家具商城销售系统
java·spring boot·后端
Meteors.28 分钟前
23种设计模式——责任链模式(Chain of Responsibility Pattern)
设计模式·责任链模式
Rexi28 分钟前
Go的代码组织结构
后端
ZhengEnCi33 分钟前
SQL 分组排序限制查询技术解析-GROUP-BY-ORDER-BY-DESC-LIMIT 实战应用
后端·sql