通俗易懂的观察者模式

观察者模式

观察者模式定义了对象之间的一对多依赖,让多个观察者同时监听某个主题对象,当主体对象发生变化时,它的所有观察者都会收到响应的通知。

基于JDK对观察者模式提供的支持,下面举个观察者模式的例子。

创建被观察者

import java.util.Observable;

/**
 * @author xzl6656
 * @create 2023-03-20 14:24
 * @description 某某微信公众号
 *
 *被观察者
 **/
public class WeChatOfficialAccount extends Observable {
    /**
     * 公众号名称
     */
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

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

    public void publishNews(News news) {
        System.out.println(this.name+"发布了新闻:"+news.getTitle()+"->"+news.getContent());
        //设置标识位 changed = true,表示被观察者发生了改变
        setChanged();
        //通知所有观察者,可以给观察者传递数据
        notifyObservers(news);
    }
}

新闻类

import lombok.AllArgsConstructor;
import lombok.Data;

/**
 * @author xzl6656
 * @create 2023-03-20 14:28
 * @description 新闻类
 **/
@Data
@AllArgsConstructor
public class News {
    /**
     *标题
     */
    private String title;
    /**
     * 内容
     */
    private String content;

}

观察者类

import java.util.Observable;
import java.util.Observer;

/**
 * @author xzl6656
 * @create 2023-03-20 14:34
 * @description 粉丝类
 * 观察者类
 **/
public class Fan implements Observer {
    /**
     * 姓名
     */
    private String name;

    public Fan(String name) {
        this.name = name;
    }
    /**
     * 公众号如果有更新,粉丝的这个方法就会被调用
     * @param o 公众号
     * @param arg 发布的新闻
     */
    @Override
    public void update(Observable o, Object arg) {
        WeChatOfficialAccount weChatOfficialAccount = (WeChatOfficialAccount) o;
        News news = (News) arg;
        System.out.println(weChatOfficialAccount.getName()+"更新了,"+this.name+"收到了更新内容:"+news.getTitle()+"->"+news.getContent());

    }
}

测试一下

public class Application {
    public static void main(String[] args) {
        //创建公众号
        WeChatOfficialAccount officialAccount = new WeChatOfficialAccount("天下奇异录");
        //添加两个粉丝
        officialAccount.addObserver(new Fan("小张"));
        officialAccount.addObserver(new Fan("小徐"));
        //公众号发布新闻
        officialAccount.publishNews(new News("经济大萧条","程序员行业开始走下坡路,大家都卷起来了"));
    }
}

打印效果:

WeChatOfficialAccount类是被观察者对象,被观察者对象需要继承JDK的Observable类,继承后,被观察者对象包含如下属性和方法:

 这些方法都是线程安全方法(加了synchronized同步锁)。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值