【Java设计模式】简单学观察者模式——爷爷,你关注的Up主终于更新了

目录

说明

实现方式

优点

缺点

其他链接


说明

  • 行为型模式之一,其他还有命令模式、模板方法模式、访问者模式、迭代器模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)
  • 观察者模式(Observer Pattern)描述的是一种一对多的关系(一个被观察者对应多个观察者),当被观察者的状态发生改变时,所有观察者都会得到通知。

  • 观察者模式设计后,会以集合的方式来管理用户 (Observer) ,包括注册,移除和通知

实现方式

在看Bilibili的时候,总会想着这个Up主怎么还不更新视频,一直在拖更。那么如何在他发布视频之后,迅速看他的视频呢?就是点点关注不迷路嘛。关注后对方一更新视频,你在动态里就可以看见。这里就涉及到观察者模式,我们以复旦之花——老番茄为例子。

 

【Java设计模式】简单学观察者模式——爷爷,你关注的Up主终于更新了_第1张图片

public class ObserverTest {
    public static void main(String[] args) {
        // B站老番茄
        BiliBili bilibili = new OldTomato();
        // B站用户
        BiliBiliFans fans1 = new BiliBiliFans("张三");
        BiliBiliFans fans2 = new BiliBiliFans("李四");
        BiliBiliFans fans3 = new BiliBiliFans("王五");
        BiliBiliFans fans4 = new BiliBiliFans("赵六");

        // B站用户张三关注老番茄
        bilibili.attachObserver(fans1);
        // B站用户李四关注老番茄
        bilibili.attachObserver(fans2);
        // B站用户王五关注老番茄
        bilibili.attachObserver(fans3);

        // 老番茄「被观察者」发布了新视频
        ((OldTomato) bilibili).submitContent("复旦一游");

        boolean isAttach = ((OldTomato) bilibili).isAttachObserver(fans4);
        if (!isAttach) {
            System.out.println(fans4.getName() + "你好!你还没有关注B站老番茄,点点关注不迷路呀");
        }
    }
}

/**
 * 定义主题「被观察者接口」
 * 

* * @author ZRH * @version 1.0.0 * @date 2020/7/23 */ interface BiliBili { /** * 添加观察者 *

* * @param fans * @return * @throws * @author : ZRH * @version : 1.0.0 * @date : 2020-07-23 */ void attachObserver(Fans fans); /** * 移除观察者 *

* * @param fans * @author : ZRH * @version : 1.0.0 * @date : 2020-07-23 */ void detachObserver(Fans fans); /** * 通知观察者 *

* * @author : ZRH * @version : 1.0.0 * @date : 2020-07-23 */ void notifyObserver(); } /** * 粉丝(Observer)定义观察者接口,即关注B站Up主的用户共同属性 *

* * @author ZRH * @version 1.0.0 * @date 2020/7/23 */ interface Fans { /** * 观察者收到信息,内容为 info *

* * @param info * @author : ZRH * @version : 1.0.0 * @date : 2020-07-23 */ void receiveContent(String info); } /** * 定义一个真实的被观察者 老番茄Up主 * 里面存了关注他的粉丝 */ class OldTomato implements BiliBili { /** * 关注者列表「观察者列表」,即关注Up主的粉丝 */ private List fans = new ArrayList<>(); /** * 作者更新的内容 */ private String updateContent; @Override public void attachObserver(Fans fans) { this.fans.add(fans); } @Override public void detachObserver(Fans fans) { if (this.fans.contains(fans)) { this.fans.remove(fans); } } @Override public void notifyObserver() { for (Fans fans : this.fans) { fans.receiveContent(updateContent); } } /** * 是否关注我的号 * * @param fans * @return */ public boolean isAttachObserver(Fans fans) { return this.fans.contains(fans); } /** * Rainbow 发布视频 * * @param updateContent */ public void submitContent(String updateContent) { this.updateContent = updateContent; this.notifyObserver(); } } /** * B站用户 *

* * @author ZRH * @version 1.0.0 * @date 2020/7/23 */ class BiliBiliFans implements Fans { /** * B站用户的姓名 */ private String name; public BiliBiliFans(String name) { this.name = name; } @Override public void receiveContent(String info) { System.out.println(name + "注意,你关注的Up主有新动态---" + info); } public String getName() { return this.name; } }

 


优点

1、解耦,被观察者只知道观察者列表(抽象接口),被观察者不知道具体的观察者

2、被观察者发送通知,所有注册的观察者都会收到信息(可以实现广播机制)


缺点

如果观察者非常多的话,那么所有的观察者收到被观察者发送的通知会耗时


其他链接

【Java设计模式】简单学工厂模式

【Java设计模式】简单学抽象工厂模式

【Java设计模式】简单学建造者模式

【Java设计模式】简单学单例模式

【Java设计模式】简单学原型模式

【Java设计模式】其他模式~

你可能感兴趣的:(Java设计模式)