Java设计模式之观察者模式(简单介绍加代码小例子)

  观察者模式是Java23个设计模式之一,也是我们最常用到的设计模式之一,我们用到的很多第三方库都用到了观察者模式。比如:EventBusRxJavaLiveData 等等。观察者模式可以描述为有一个被观察者,还有一个或多个观察者,当被观察者有变化时,观察者能收到这些变化,可以说是一对多的关系被观察者可以理解为一个信息的发布者观察者可以理解为信息的订阅者(接收者),每当发布者发布信息的消息时,订阅者都会接收到。
  这里得先提一下Java的回调方法,个人认为回调方法观察者模式是一样的,只不过回调方法一对一的关系,可以说是观察者只有一个。

  下面通过一个简单的小例子说明观察者模式是如何实现的:
这里有一个哔哩哔哩的up主(发布视频)和多个用户(接收视频更新消息),用户可以订阅(关注)up主,这样up主发布新的视频,订阅用户那面就都能实时收到更新消息了。

首先定义抽象的观察者:

/**
 * 抽象观察者
 */

interface Observer {
    /**
     * 当被观察者有变化时,被观察者会通过持有的观察者引用,回调此方法
     */
    void update(String message);
}

定义抽象的被观察者:

/**
 * 抽象的被观察者
 */

interface Observable {
    /**
     * 注册观察者对象
     * @param o
     */
    void registerObserver(Observer o);

    /**
     * @param o 移除观察者对象
     */
    void removeObserver(Observer o);

    /**
     * 被观察者发生变化时,通知观察者
     */
    void notifyObservers();
}

定义Bilibili视频UP主类,并实现抽象被观察者接口:

/**
 * Bilibili视频UP主
 */

class BiliUper implements Observable {
    private List<Observer> observerList; // 观察者列表
    private String uperName; // UP主的名字
    private String videoName; // 发布视频的名字

    public BiliUper(String uperName) {
        observerList = new ArrayList<>();
        this.uperName = uperName;
    }

    @Override
    public void registerObserver(Observer o) {
        observerList.add(o); // 添加观察者
    }

    @Override
    public void removeObserver(Observer o) {
        observerList.remove(o); // 移除观察者
    }

    @Override
    public void notifyObservers() {
        for (Observer o: observerList) {
             o.update(videoName); // 回调观察者的方法
        }
    }

    /**
     * UP主更新视频方法
     * @param videoName 视频名字 
     */
    public void publishANewVideo(String videoName) {
        this.videoName = videoName;
        System.out.println(uperName + "更新了一个视频:" + videoName);
        notifyObservers();
    }
}

定义普通用户类,并实现观察者接口:

/**
 * 普通用户
 */

class User implements Observer {
    private String userName;

    public User(String userName) {
        this.userName = userName;
    }

    @Override
    public void update(String videoName) {
        System.out.println("用户" + userName + "收到了更新的视频:" + videoName);
    }
}

程序主类:

/**
 * 程序入口类
 */

class Main {

    public static void main(String... args) {
        BiliUper uper = new BiliUper("up主阿猪"); // 实例化一个UP主叫阿猪

        Observer xiaoMing = new User("小名"); // 实例化用户小名
        Observer aQiang = new User("阿强"); // 实例化用户阿强
        Observer huaHu = new User("花虎"); // 实例化用户花虎

        uper.registerObserver(xiaoMing); // 添加观察者,接收UP主更新
        uper.registerObserver(aQiang); // 同上
        uper.registerObserver(huaHu); // 同上

        uper.publishANewVideo("教大家如何种草!"); // UP主阿猪发布一个新视频叫“如何种草”

        System.out.println("\n---过了段时间---\n"); // 模拟过了一段时间

        uper.removeObserver(xiaoMing); // 移除观察者,不再接收UP主视频更新提醒
        uper.removeObserver(aQiang); // 同上

        uper.publishANewVideo("教大家如何除草!"); // UP主阿猪又发布了一个新视频
    }

}

程序运行结果:
程序运行结果

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java的观察者设计模式是一种一对多的依赖关系,其中目标对象维护一组观察者对象,当目标对象的状态发生变化时,它会自动通知并更新所有的观察者对象。这种模式可以使目标对象与观察者对象之间解耦,使它们可以独立地进行修改和重用。 在Java中,观察者模式已经被封装成了两个接口:目标接口(Observable)和观察者接口(Observer)。目标接口(Observable)定义了添、删除和通知观察者对象的方法,而观察者接口(Observer)定义了观察者对象接收更新通知的方法。 在实际应用中,我们可以通过实现观察者接口(Observer)来创建具体的观察者对象,并通过实现目标接口(Observable)来创建具体的目标对象。具体的观察者对象可以订阅目标对象的状态变化,并根据变化做出相应的响应。 在Java中,观察者模式被广泛应用于各个领域。在Android开发中,许多常见的组件和框架都使用了观察者模式,比如OnClickListener、ContentObserver,以及RxJava、RxAndroid和EventBus等通讯库。这些例子都是基于观察者模式的实现,通过观察者模式可以实现组件之间的解耦和灵活的消息传递。 总结来说,Java的观察者设计模式是一种实现目标和观察者对象之间解耦的设计模式,它可以提高代码的灵活性和可维护性。在实际应用中,我们可以使用Java提供的目标接口(Observable)和观察者接口(Observer)来实现观察者模式,并通过具体的观察者对象订阅目标对象的状态变化。这种设计模式在Android开发中也被广泛应用,并带来了许多便利的消息传递和通讯方式。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Java设计模式观察者模式(Observer Pattern)](https://blog.csdn.net/engineer_zh/article/details/78857166)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [java设计模式观察者模式](https://blog.csdn.net/m0_47944994/article/details/127903096)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值