JAVA设计模式——观察者模式

前言:

观察者模式,又可以称之为发布-订阅模式,顾名思义,简而言之我们可以理解成,7点半播放天气预报,电视里那个主持人就是发布者,也就是所谓的被观察者,我们这些听天气预报的人也就是所谓的观察者。也就是说他一个人(被观察者)发布一条消息,我们这些听天气预报的人(观察者)都知道了这个消息。

1,被观察者接口(也就是天气预报主持人的接口,每天可以换主持人播报):

package com.itpengwei.design;

/**
 * @author 彭伟
 * @Date 2019/1/4 20:30
 * 被观察者接口
 * 声明了添加,删除,通知观察者方法
 */
public interface Observerable {
    /**
     * @param observer 抽象观察者
     *                 添加观察者
     */
    void registerObserver(Observer observer);

    /**
     * @param observer 抽象观察者
     *                 删除观察者
     */
    void removeObserver(Observer observer);

    /**
     * 通知观察者
     */
    void notifyObserver();


}

2,消费者的接口(也就是所谓的收听天气预报的所有人统称为收听者)

package com.itpengwei.design;

/**
 * @author 彭伟
 * @Date 2019/1/4 20:32
 * 观察者接口,收听天气预报的人的统称
 */
public interface Observer {
    /**
     * @param msg 消息
     *            生产者发布通知,接口进行回调
     */
    void update(String msg);
}

3,被观察者实现(天气预报主持人)

package com.itpengwei.design;

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

/**
 * @author 彭伟
 * @Date 2019/1/4 20:54
 * 被观察者,也就是天气预报总站
 * 实现了Oberverable接口,对它进行了一个实现
 */
public class WeacherServer implements Observerable {
    /**
     * 装所有消费者
     */
    private List<Observer> list;
    private String msg;

    public WeacherServer() {
        list = new ArrayList<Observer>();
    }

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

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

    @Override
    public void notifyObserver() {
        for (Observer observer : list) {
            observer.update(msg);
        }
    }

    /**
     * @param s 发送消息内容
     *          发送消息方法
     */
    public void sendmsg(String s) {
        this.msg = s;
        System.out.println("----生产者生产的新消息-------");
        //消息更新,通知所有观察者
        notifyObserver();
    }
}

4,消费者具体实现

package com.itpengwei.design;

/**
 * @author 彭伟
 * @Date 2019/1/4 21:02
 * 消费者,也就是听天气预报的人
 */
public class Consumer implements Observer {
    private String username;

    public Consumer(String username) {
        this.username = username;
    }

    @Override
    public void update(String msg) {
        System.out.println("----"+this.username+"----" + msg);
    }

}

5,测试类

import com.itpengwei.design.Consumer;
import com.itpengwei.design.Observer;
import com.itpengwei.design.WeacherServer;

public class Main {

    public static void main(String[] args) {
        WeacherServer server = new WeacherServer();
        Observer userzhang = new Consumer("张三");
        Observer userlisi = new Consumer("李四");
        Observer userwangwu = new Consumer("王五");
        server.registerObserver(userzhang);
        server.registerObserver(userlisi);
        server.registerObserver(userwangwu);
        //第一次发消息,消费者为3个人
        server.sendmsg("今天晴,气温27℃");

        //第二次推送消息,消费者为4个人,加了个赵六
        System.out.println("----添加了赵六后总共有4个消费者了--------");
        Observer userzhaoliu = new Consumer("赵六");
        server.registerObserver(userzhaoliu);
        server.sendmsg("今天下雨,气温23℃");

    }
}

6,测试结果

7,总结

通过上面的实例可以很明显的看出,观察者模式的大概模型,关键是什么呢?

  1、针对观察者与被观察者分别定义接口,有利于分别进行扩展。

  2、重点就在被观察者的实现中:

   (1)定义观察者集合,并定义针对集合的添加、删除操作,用于增加、删除订阅者(观察者)

   (2)定义通知方法,用于将新情况通知给观察者用户(订阅者用户)

  3、观察者中需要有个接收被观察者通知的方法。

观察者模式定义的是一对多的依赖关系,一个被观察者可以拥有多个观察者,并且通过接口对观察者与被观察者进行逻辑解耦,降低二者的直接耦合。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章