【設計模式】最常用的設計模式之一的觀察者模式
以下是之前做的“產品詳情頁”的長截圖,這裡講解一下這個頁面與“觀察者模式”的關係:在活動季,底部的“開始預訂按鈕”會變成“秒殺按鈕”(所謂秒殺按鈕,就是一個顯示成灰色不可點選,並且一直處於倒數計時狀態的按鈕,直到到達秒殺時間,比如0點整,秒殺按鈕才由灰色變為橘黃色,並且可以點選), 當秒殺時間到時,不光底部的“秒殺按鈕”變為“開始預訂按鈕”,可選班期的幾個按鈕也從灰色不可點選狀態,變為白色可點選狀態。相信熟悉設計模式的人已經想到這就是“觀察者模式”。
觀察者模式,應該是很多人學設計模式時,學的第一個設計模式吧>
最近在研究redux原始碼時,也看到了觀察者模式,想來這個這麼常用的設計模式我還沒有寫過文章介紹,並且對於這個設計模式我還是有一定心得的,於是就有了這篇文章。。
一. 觀察者模式簡介
1. 定義
觀察者模式:定義物件間一種一對多的依賴關係,使得每當一個物件改變狀態,則所有依賴它的物件都會得到通知並自動更新。
2. 意義
此設計模式最重要的作用就是 解耦!將觀察者與被觀察者解耦,使得他們之間的依賴性更小。
###3. UML圖
- Subject:就是“被觀察”的角色,它將所有觀察者物件的引用儲存在一個集合中。
- Observer:是抽象的“觀察”角色,它定義了一個更新介面,使得在被觀察者狀態發生改變時通知自己。
- ConcreteObserver:具體的觀察者。
二. 觀察者模式實現
以上理論相信大家並不模式,現在我們來應用到實際中。
1. 被觀察者Subject物件
首先是一個Subject類的父類,它實現了維護裝有觀察者引用集合的功能。
public class Subject {
//儲存註冊的觀察者物件
private List<Observer> mObervers = new ArrayList<>();
//註冊觀察者物件
public void attach(Observer observer) {
mObervers.add(observer);
Log.e("SZH", "attach an observer");
}
//登出觀察者物件
public void detach(Observer observer) {
mObervers.remove(observer);
Log.e("SZH", "detach an observer");
}
//通知所有註冊的觀察者物件
public void notifyEveryOne(String newState) {
for (Observer observer : mObervers) {
observer.update(newState);
}
}
}
接著是一個具體的被觀察者物件
public class ConcreteSubject extends Subject {
private String state;
public String getState() {
return state;
}
public void change(String newState) {
state = newState;
Log.e("SZH", "concreteSubject state:" + newState);
//狀態發生改變,通知觀察者
notifyEveryOne(newState);
}
}
2. 觀察者Observer物件
首先是一個介面,抽象出了一個及時更新的方法
public interface Observer {
void update(String newState);
}
接著是幾個觀察者物件。
public class ObserverA implements Observer {
//觀察者狀態
private String observerState;
@Override
public void update(String newState) {
//更新觀察者狀態,讓它與目標狀態一致
observerState = newState;
Log.e("SZH", "接收到訊息:" + newState + ";我是A模組,快來搶吧!!");
}
}
public class ObserverB implements Observer {
//觀察者狀態
private String observerState;
@Override
public void update(String newState) {
//更新觀察者狀態,讓它與目標狀態一致
observerState = newState;
Log.e("SZH", "接收到訊息:" + newState + ";我是B模組,快來搶吧!!");
}
}
public class ObserverC implements Observer {
//觀察者狀態
private String observerState;
@Override
public void update(String newState) {
//更新觀察者狀態,讓它與目標狀態一致
observerState = newState;
Log.e("SZH", "接收到訊息:" + newState + ";我是C模組,快來搶吧!!");
}
}
為了讓大家更好的理解,以上uml圖可以通過下面這個圖更好地記憶。
三. 最後
以上設計模式的程式碼都已經整合到demo中,歡迎下載檢視。
該demo會陸續整合各種設計模式,歡迎關注。
參考
https://blog.csdn.net/itermeng/article/details/52595691
https://my.oschina.net/122612475/blog/834686
https://www.cnblogs.com/mythou/p/3370340.html
相關文章
- Java常用設計模式之觀察者模式Java設計模式
- 設計模式 —— 觀察者模式設計模式
- 設計模式(觀察者模式)設計模式
- 設計模式----觀察者模式設計模式
- 【設計模式】觀察者模式設計模式
- 設計模式——觀察者模式設計模式
- 設計模式中的觀察者模式設計模式
- 【設計模式】漢堡中的設計模式——觀察者模式設計模式
- PHP設計模式-觀察者模式PHP設計模式
- Java設計模式-觀察者模式Java設計模式
- 設計模式解析:觀察者模式設計模式
- 設計模式之觀察者模式設計模式
- 設計模式之-觀察者模式設計模式
- 設計模式 #6 (觀察者模式)設計模式
- JS設計模式(觀察者模式)JS設計模式
- 設計模式(十六)觀察者模式設計模式
- 設計模式之【觀察者模式】設計模式
- 設計模式(9) 觀察者模式設計模式
- 設計模式-觀察者模式上設計模式
- 設計模式-觀察者模式下設計模式
- Android 中的設計模式:觀察者模式Android設計模式
- Go 實現常用設計模式(五)觀察者模式Go設計模式
- Go 設計模式之觀察者模式Go設計模式
- 設計模式之觀察者模式(一)設計模式
- PHP 設計模式之——觀察者模式PHP設計模式
- 設計模式實戰 - 觀察者模式設計模式
- PHP設計模式(5)—— 觀察者模式PHP設計模式
- JavaScript設計模式之觀察者模式JavaScript設計模式
- golang設計模式之觀察者模式Golang設計模式
- Java 設計模式之《觀察者模式》Java設計模式
- 設計模式解析-1:觀察者模式設計模式
- python設計模式之觀察者模式Python設計模式
- PHP設計模式之觀察者模式PHP設計模式
- 《Head First 設計模式》:觀察者模式設計模式
- PHP 設計模式之觀察者模式PHP設計模式
- 簡說設計模式——觀察者模式設計模式
- 極簡設計模式-觀察者模式設計模式
- 徒手擼設計模式-觀察者模式設計模式