码迷,mamicode.com
首页 > 编程语言 > 详细

Java观察者模式实例

时间:2021-06-02 20:20:11      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:read   not   update   实例   接收   test   mic   sage   com   

在观察者模式中,包括以下四个角色:

  • 主题(被观察者)(Subject):主题是一个接口,该接口规定了具体主题需要实现的方法,比如,添加、删除观察者以及通知观察者更新数据的方法。

  • 观察者(Observer):观察者是一个接口,该接口规定了具体观察者用来更新数据的方法。

  • 具体主题(ConcreteSubject):具体主题是实现主题接口类的一个实例,该实例包含有可以经常发生变化的数据。具体主题需使用一个集合,比如ArrayList,存放观察者的引用,以便数据变化时通知具体观察者。

  • 具体观察者(ConcreteObserver):具体观察者是实现观察者接口类的一个实例。具体观察者包含有可以存放具体主题引用的主题接口变量,以便具体观察者让具体主题将自己的引用添加到具体主题的集合中,使自己成为它的观察者,或让这个具体主题将自己从具体主题的集合中删除,使自己不再是它的观察者。

实现案例: 不同的几个用户订阅了某个平台的消息,该平台发布一条消息后,所有的订阅者都可以接收到这条消息

步骤一:定义一个被观察者(主题)接口

/**
 * 定义一个被观察者(主题)接口
 */
public interface ObserverSubject {

    public void registerObserver(Observer o);

    public void removeObserver(Observer o);

    public void notifyObserver();
}

步骤二:定义一个类实现被观察者(主题)接口

import java.util.ArrayList;
import java.util.List;

/**
 * 具体主题类,实现主题接口
 */
public class WecharSubject implements ObserverSubject {

    //    这个集合是实现“不知道有多少对象需要进行相应修改”的关键
    List<Observer> list = new ArrayList<>();

    String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
        notifyObserver();
    }

    @Override
    public void registerObserver(Observer o) {
//        将观察者对象添加进集合中
        list.add(o);
    }

    @Override
    public void removeObserver(Observer o) {
        if (!list.isEmpty())
            list.remove(o);
    }

    /**
     * 遍历更新消息
     */
    @Override
    public void notifyObserver() {
        for (Observer ll : list) {
            Observer observer = ll;
            observer.update(message);
        }
    }
}

步骤三:定义一个观察者接口,订阅消息的更新功能

/**
 * 定义一个观察者接口
 */
public interface Observer {
    public void update(String message);
}

步骤四:定义一个类实现观察者接口

/**
 * 定义一个具体观察者,也就是订阅者
 */
public class UserObserver implements Observer {

    String name;
    String message;

    public String getName() {
        return name;
    }

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

    public void read() {
        System.out.println(name + "收到推送的消息:" + message);
    }

    @Override
    public void update(String message) {
        this.message = message;
        read();
    }
}

添加用户进行消息订阅

public class Test {

    @org.junit.Test
    public void test() {
        WecharSubject wecharSubject = new WecharSubject();

        UserObserver user = new UserObserver();
        user.setName("小明");

        UserObserver user1 = new UserObserver();
        user1.setName("小红");

//        添加订阅者
        wecharSubject.registerObserver(user);
        wecharSubject.registerObserver(user1);

//       给订阅者发布消息
        wecharSubject.setMessage("快把包子吃了");

    }


}

技术图片

Java观察者模式实例

标签:read   not   update   实例   接收   test   mic   sage   com   

原文地址:https://www.cnblogs.com/lyd447113735/p/14838387.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!