前言:
觀察者模式,又可以稱之爲發佈-訂閱模式,顧名思義,簡而言之我們可以理解成,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、觀察者中需要有個接收被觀察者通知的方法。
觀察者模式定義的是一對多的依賴關係,一個被觀察者可以擁有多個觀察者,並且通過接口對觀察者與被觀察者進行邏輯解耦,降低二者的直接耦合。