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、觀察者中需要有個接收被觀察者通知的方法。

觀察者模式定義的是一對多的依賴關係,一個被觀察者可以擁有多個觀察者,並且通過接口對觀察者與被觀察者進行邏輯解耦,降低二者的直接耦合。

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