设计模式之观察者模式

原博文链接:https://www.cnblogs.com/porotin/p/7825656.html  

观察者模式定义:在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。可以理解为发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。

场景及实现:微信公众号服务,不定时发布一些消息,关注公众号就可以收到推送消息,取消关注就收不到推送消息。

1. 定义一个观察者接口

public interface Observer {
    /**
     * 观察者收到公众号更新的内容
     * @param message
     */
    void update(String message);
}

2. 实现观察者接口

public class User implements Observer {

    private String name;

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

    @Override
    public void update(String message) {
        System.out.println(this.name + "收到了消息:" + message);
    }
}

3. 定义一个抽象被观察者接口,本例中被观察者就是微信公众号。

public interface ObserverServer {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObserver(String message);
}

4.  实现被观察者接口

public class WeChatServer implements ObserverServer {

    private String message;
    private List<Observer> observers = new ArrayList<>();

    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        if (observers.size() > 0) {
            observers.remove(observer);
        }
    }

    @Override
    public void notifyObserver(String message) {
        for (Observer observer : observers) {
            observer.update(message);
        }
    }

5. 开始测试,首先创建三个人john, lucy, lily订阅公众号,公众号发布消息"PHP是世界上最好的语言",大家都可以收到消息。 john作为一个java程序员,收到消息后,立马取关。

public class MainTest {
    public static void main(String[] args) {
        WeChatServer server = new WeChatServer();
        User john = new User("john");
        User lucy = new User("lucy");
        User lily = new User("lily");
        server.registerObserver(john);
        server.registerObserver(lucy);
        server.registerObserver(lily);
        System.out.println("开始推送消息");
        server.notifyObserver("PHP是世界上最好的语言");
        server.removeObserver(john);
        System.out.println("-------------john取关");
        System.out.println("开始推送消息");
        server.notifyObserver("PHP是世界上最好的语言");
    }
}

打印结果

开始推送消息
john收到了消息:PHP是世界上最好的语言
lucy收到了消息:PHP是世界上最好的语言
lily收到了消息:PHP是世界上最好的语言
-------------john取关
开始推送消息
lucy收到了消息:PHP是世界上最好的语言
lily收到了消息:PHP是世界上最好的语言
posted on 2020-10-03 17:38  lvguoliang(学无止境)  阅读(73)  评论(0)    收藏  举报