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

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

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

运行结果如下:

相关推荐
Pniubi13 分钟前
MySQL靠什么实现事务的?事务隔离级别有哪些?
java·数据库·mysql
松仔log1 小时前
Kotlin中级——callbackFlow
java·前端·kotlin
知守观2 小时前
同一个团队两套分包:DDD 四层落地后,domain 层最大的类还是 5885 行
java·后端·领域驱动设计
文丑颜不良啊2 小时前
LeetCode2541~2560题目解析
java·leetcode
瑞雪兆丰年兮2 小时前
JavaWeb-day11-SpringBootWeb案例(文件上传)
java·运维·服务器·javaweb·oss
Highcharts.js3 小时前
Highcharts智能数据分析平台Orbit 多语言配置技术文档
java·前端·javascript·highcharts·orbit·智能数据分析·设置文档
Rain的Java大神之路3 小时前
设计一套生产级 API 接口:从契约、安全、幂等到限流,我踩过的坑都在这了
java·后端·面试
SimonKing3 小时前
零配置也能白嫖前沿大模型!dsh-our-free-model插件真香警告
java·后端·程序员
nice_lcj5203 小时前
【从零理解 Spring AI · 15】让检索更准:先宽召回,再精排序
java·后端·rag·spring ai·ai应用开发·检索优化·重排序
杨凯凡4 小时前
Spring Boot 链路追踪实战:Micrometer、TraceId 与异步线程上下文传播
java·spring boot·后端