Java观察者模式实例

时间:2021-06-02 20:20:11   收藏:0   阅读:0

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

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

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

/**
 * 定义一个被观察者(主题)接口
 */
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("快把包子吃了");

    }


}

技术图片

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!