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

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

观察者模式(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();
    }
}

运行结果如下:

相关推荐
瓯雅爱分享3 小时前
Java+Vue构建的采购招投标一体化管理系统,集成招标计划、投标审核、在线竞价、中标公示及合同跟踪功能,附完整源码,助力企业实现采购全流程自动化与规范化
java·mysql·vue·软件工程·源代码管理
mit6.8245 小时前
[C# starter-kit] 命令/查询职责分离CQRS | MediatR |
java·数据库·c#
诸神缄默不语6 小时前
Maven用户设置文件(settings.xml)配置指南
xml·java·maven
任子菲阳6 小时前
学Java第三十四天-----抽象类和抽象方法
java·开发语言
学Linux的语莫6 小时前
机器学习数据处理
java·算法·机器学习
找不到、了6 小时前
JVM的即时编译JIT的介绍
java·jvm
rongqing20197 小时前
Google 智能体设计模式:人机协同(HITL)
设计模式
西瓜er7 小时前
JAVA:Spring Boot 集成 FFmpeg 实现多媒体处理
java·spring boot·ffmpeg
你总是一副不开心的样子(´ . .̫ .7 小时前
一、十天速通Java面试(第三天)
java·面试·职场和发展·java面试
迎風吹頭髮7 小时前
UNIX下C语言编程与实践63-UNIX 并发 Socket 编程:非阻塞套接字与轮询模型
java·c语言·unix