设计模式—行为型模式之观察者模式

设计模式---行为型模式之观察者模式

观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。这是一种对象行为型模式。

观察者模式有如下角色:

  • Subject: 目标

  • ConcreteSubject: 具体目标

  • Observer: 观察者

  • ConcreteObserver: 具体观察者

示例

比如现在大火的主播,可以直播卖货,直播卖货时可以通知给粉丝,结束卖货时也可以通知给粉丝。我们可以在主播中维护一个粉丝的列表,来进行通知。

代码如下:

java 复制代码
/**
 * 抽象主播类
 */
public abstract class AbstarctAnchor {

    //添加粉丝
    abstract void addFans(AbstarctFans fans);

    //通知粉丝
    abstract void notifyFans(String msg);

}

/**
抽象粉丝类
 */
public abstract class AbstarctFans {

    //接收消息
    abstract void acceptMsg(String msg);

    //关注主播
    public void follow(AbstarctAnchor anchor){
        anchor.addFans(this);
    }
}

卖奥特曼的主播为:

java 复制代码
/**
 * 卖奥特曼的主播
 */
@Slf4j
public class SellingUltramanAnchor extends AbstarctAnchor{

    //粉丝列表
    private List<AbstarctFans> fansList = new ArrayList<>();


    //卖奥特曼
    public void selling(){
        log.info("我是卖奥特曼的主播,我来卖奥特曼了....");
        //通知粉丝
        notifyFans("主播来卖货了");
    }

    //结束卖奥特曼
    public void end(){
        log.info("奥特曼卖没了....");
        //通知粉丝
        notifyFans("主播结束卖货了");
    }

    @Override
    void addFans(AbstarctFans fans) {
        fansList.add(fans);
    }

    @Override
    void notifyFans(String msg) {
        //获取所有粉丝进行通知
        for (AbstarctFans abstarctFans : fansList) {
            abstarctFans.acceptMsg(msg);
        }
    }
}

忠实粉丝和黑粉类如下

java 复制代码
/**
 * 忠实粉丝
 */
@Slf4j
public class LoyalFans extends AbstarctFans{
    @Override
    void acceptMsg(String msg) {
        log.info("卖奥特曼的主播来了,他说:"+msg);
    }
}
/**
 * 黑粉
 */
@Slf4j
public class AntiFan extends AbstarctFans{
    @Override
    void acceptMsg(String msg) {
        log.info("这个卖奥特曼的主播卖的奥特曼不会发光,别买!!!");
    }
}

测试类如下

java 复制代码
public class ObserverTest {
    public static void main(String[] args) {
        //卖奥特曼的主播对象
        SellingUltramanAnchor anchor = new SellingUltramanAnchor();
        //忠实粉丝1
        AbstarctFans loyalFans1 = new LoyalFans();
        loyalFans1.follow(anchor);
        //忠实粉丝2
        AbstarctFans loyalFans2 = new LoyalFans();
        loyalFans2.follow(anchor);

        //黑粉
        AbstarctFans antiFan = new AntiFan();
        antiFan.follow(anchor);

        //开播
        anchor.selling();
        //结束直播
        anchor.end();
    }
}

运行结果如下:

相关推荐
魏 无羡7 小时前
webclient
java·webclient
神仙别闹8 小时前
基于 C++ 实现两个有序链表序列的交集
java·c++·链表
swordbob9 小时前
ReentrantLock 与 AQS 完整学习手册
java·开发语言
m0_587383009 小时前
全民健身解决方案软件开发实战:从架构设计到落地指南
java·spring boot·spring·架构·需求分析
白山编程大哥9 小时前
Java OutputStreamWriter 详解:从字符到字节的桥梁
java·开发语言·python
一技安身10 小时前
【信创】Docker‑Compose V2 两种离线部署(独立模式、插件模式)简易教程
java·docker·eureka
七夜zippoe11 小时前
为什么 2026 年每个 Java 团队都该懂 AI Agent
java·开发语言·人工智能
时凌云.11 小时前
【2026最新】JDK 下载安装与环境配置全教程(Windows/Mac/Linux 三平台,零基础友好)
java·linux·macos
Despacito100611 小时前
Java后端性能探查工具速查表
java·开发语言
蓝桉柒711 小时前
下载idea,用idea输入一个程序
java·ide·intellij-idea