设计模式 行为型模式 -- 观察者模式(发布-订阅(Publish/Subscribe)模式)

Posted CodeJiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式 行为型模式 -- 观察者模式(发布-订阅(Publish/Subscribe)模式)相关的知识,希望对你有一定的参考价值。

设计模式 行为型模式 – 观察者模式 JDK中提供的实现:Observabie类

1. 观察者模式


1.1 引入

分析:



1.2 定义



1.3 结构


1.3.1 典型的抽象目标类代码


1.3.2 典型的具体目标类代码


1.3.3 典型的抽象观察者代码


1.3.4 典型的具体观察者代码


1.3.5 典型的客户端代码片段


1.3.6 补充:说明


1.4 【例】微信公众号

需求分析:

在使用微信公众号时,大家都会有这样的体验,当你关注的公众号中有新内容更新的话,它就会推送给关注公众号的微信用户端。我们使用观察者模式来模拟这样的场景,微信用户就是观察者,微信公众号是被观察者,有多个的微信用户关注了程序猿这个公众号。

类图如下:

代码实现:

Observer.java

package com.tian.observer;

/**
 * @version v1.0
 * @ClassName: Observer
 * @Description: 抽象观察者类
 */
public interface Observer {
    void update(String message);
}

WeiXinUser.java

package com.tian.observer;

/**
 * @version v1.0
 * @ClassName: WeiXinUser
 * @Description: 具体的观察者角色类
 */
public class WeiXinUser implements Observer {

    private String name;

    public WeiXinUser(String name) {
        this.name = name;
    }

    public void update(String message) {
        System.out.println(name + "-" + message);
    }
}

Subject.java

package com.tian.observer;


/**
 * @version v1.0
 * @ClassName: Subject
 * @Description: 抽象主题角色类
 */
public interface Subject {

    //添加订阅者(添加观察者对象)
    void attach(Observer observer);

    //删除订阅者
    void detach(Observer observer);

    //通知订阅者更新消息
    void notify(String message);
}

Client.java

package com.tian.observer;

/**
 * @version v1.0
 * @ClassName: Client
 * @Description: 客户端类:测试类
 */
public class Client {
    public static void main(String[] args) {
        //1,创建公众号对象
        SubscriptionSubject subject = new SubscriptionSubject();

        //2,订阅公众号
        subject.attach(new WeiXinUser("用户一"));
        subject.attach(new WeiXinUser("用户二"));
        subject.attach(new WeiXinUser("用户三"));

        //3,公众号更新,发出消息给订阅者(观察者对象)
        subject.notify("不给糖果就捣乱额!");
    }
}

1.4.1 运行结果


1.5 优缺点分析 适用场景


1.5.1 优点

  • 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。
  • 被观察者发送通知,所有注册的观察者都会收到信息【可以实现广播机制】

1.5.2 缺点

  • 如果观察者非常多的话,那么所有的观察者收到被观察者发送的通知会耗时
  • 如果被观察者有循环依赖的话,那么被观察者发送通知会使观察者循环调用,会导致系统崩

1.5.3 适用场景

  • 对象间存在一对多关系,一个对象的状态发生改变会影响其他对象。
  • 当一个抽象模型有两个方面,其中一个方面依赖于另一方面时。


以上是关于设计模式 行为型模式 -- 观察者模式(发布-订阅(Publish/Subscribe)模式)的主要内容,如果未能解决你的问题,请参考以下文章

行为型设计模式 - 观察者模式详解

设计模式之行为型中介模式

行为型模式--观察者模式

设计模式(19)--Observer(观察者模式)--行为型

行为型模式之观察者模式

手撸golang 行为型设计模式 观察者模式