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主阿猪又发布了一个新视频
    }

}

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

猜你喜欢

转载自blog.csdn.net/c1024197824/article/details/89367632
今日推荐