摘要:觀察者模式的使用場景比如你微博關(guān)注了一個人,那么這個人發(fā)布的微博就會推送到你這。
Java設(shè)計模式之觀察者模式
一直想寫一篇學(xué)習觀察者模式的總結(jié)沒有契機,今天學(xué)習阻塞隊列的原理時候看到在實現(xiàn)生產(chǎn)者消費者的時候用到了通知模式,就是所謂的觀察者模式,正好順便整理一下。
1. 簡介觀察者模式定義對象間的一種一對多的依賴關(guān)系,當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并被自動更新。也就是 發(fā)布-訂閱 的模式。
觀察者模式涉及到的參與者有:
Subject(目標):被觀察者的接口,提供注冊/刪除觀察者和發(fā)通知的方法;
Observer(觀察者):觀察目標的對象接口,提供目標發(fā)生改變時需要處理更新的方法;
ConcreteSubject(具體目標):實現(xiàn)被觀察者接口的具體被觀察者類,維護一個觀察者的引用,在發(fā)通知的時候調(diào)用觀察者的更新方法;
ConcreteObserver(具體觀察者):實現(xiàn)觀察者接口的具體觀察者類。
觀察者模式的使用場景比如你微博關(guān)注了一個人,那么這個人發(fā)布的微博就會推送到你這。
還比如你關(guān)注了一個微信公眾號,這個公眾號發(fā)布的文章也會推送到你這。
2. 實例代碼就拿微博關(guān)注來舉個例子,一些人關(guān)注了一個大V,那么大V每次發(fā)微博,這些人就會收到推送,哪天大V發(fā)的微博讓某些人不爽了,果斷取關(guān),那么以后就不會收到大V的推送消息了。
新建Subject接口package con.wangjun.designPattern.observer; public interface Subject { public void addFans(Observer o); // 添加粉絲 public void removeFans(Observer o); // 移除粉絲 public void notifyFans(String str); // 通知粉絲 }新建Observer接口
package con.wangjun.designPattern.observer; public interface Observer { // 當被觀察者調(diào)用notifyFans發(fā)通知,update方法會被回調(diào) public void update(String str); }新建Subject實現(xiàn)類
package con.wangjun.designPattern.observer; import java.util.ArrayList; import java.util.List; public class VSubject implements Subject { List新建Observer實現(xiàn)類list = new ArrayList<>(); // 發(fā)布微博 public void publish(String str) { System.out.println("大V發(fā)布微博:" + str); // 通知所有粉絲 notifyFans(str); } @Override public void addFans(Observer o) { list.add(o); } @Override public void removeFans(Observer o) { list.remove(o); } @Override public void notifyFans(String str) { for(int i = 0; i < list.size(); i++) { list.get(i).update(str); } } }
package con.wangjun.designPattern.observer; public class FansObserver implements Observer { private String name; public FansObserver(String name) { this.name = name; } @Override public void update(String str) { System.out.println(name + " 收到大V的微博發(fā)文:" + str); } }新建測試類
package con.wangjun.designPattern.observer; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { VSubject vs = new VSubject(); // 大V的實例 List運行結(jié)果fans = new ArrayList<>(); //存儲所有粉絲 for(int i = 0; i < 5; i++) { FansObserver f = new FansObserver("name" + (i + 1)); fans.add(f); vs.addFans(f); } // 本次發(fā)微博,5個粉絲都收到推送 vs.publish("我的女朋友真好看!"); // 居然秀恩愛,前2個粉絲,看不下去了,取關(guān)! for(int i = 0; i < 2; i++) { vs.removeFans(fans.get(i)); } //這次發(fā)微博,那兩個取關(guān)的人就看不到了 vs.publish("我要送所有粉絲一部iPhone X"); } }
大V發(fā)布微博:我的女朋友真好看! name1 收到大V的微博發(fā)文:我的女朋友真好看! name2 收到大V的微博發(fā)文:我的女朋友真好看! name3 收到大V的微博發(fā)文:我的女朋友真好看! name4 收到大V的微博發(fā)文:我的女朋友真好看! name5 收到大V的微博發(fā)文:我的女朋友真好看! 大V發(fā)布微博:我要送所有粉絲一部iPhone X name3 收到大V的微博發(fā)文:我要送所有粉絲一部iPhone X name4 收到大V的微博發(fā)文:我要送所有粉絲一部iPhone X name5 收到大V的微博發(fā)文:我要送所有粉絲一部iPhone X
參考:《面向?qū)ο蟮脑O(shè)計模式》
JAVA設(shè)計模式之觀察者模式https://www.cnblogs.com/luoha...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/69623.html
摘要:三內(nèi)置觀察者模式了解內(nèi)置觀察者模式包內(nèi)包含最基本的類與接口,這和上面的接口與接口很類似。根據(jù)具體的需求,如果內(nèi)置的觀察者模式不能滿設(shè)計,那么我們可以像剛開始那樣自己實現(xiàn)一套觀察者模式。參考資料設(shè)計模式 一、了解觀察者模式 1.1 什么是觀察者模式 觀察者模式定義了對象之間的一對多依賴,這樣一來,當一個對象狀態(tài)改變時,它的所有依賴者都會收到通知并自動更新。 典型的問題比如報社,只要你是他...
摘要:觀察者模式也稱發(fā)布訂閱模式它的作用就是當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都將得到通知,自動刷新對象狀態(tài)舉個生活比較常見常見的例子比如你去面試之后,面試官看你表現(xiàn)不錯,最后會跟你要聯(lián)系方式,以便之后可以聯(lián)系你。 觀察者模式也稱發(fā)布-訂閱模式,它的作用就是當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都將得到通知,自動刷新對象狀態(tài) 舉個生活比較常見常見的例子,比如你去面試之后,...
摘要:關(guān)鍵概念理解觀察者設(shè)計模式中主要區(qū)分兩個概念觀察者指觀察者對象,也就是消息的訂閱者被觀察者指要觀察的目標對象,也就是消息的發(fā)布者。 原文首發(fā)于微信公眾號:jzman-blog,歡迎關(guān)注交流! 最近補一下設(shè)計模式相關(guān)的知識,關(guān)于觀察者設(shè)計模式主要從以下幾個方面來學(xué)習,具體如下: 什么是觀察者設(shè)計模式 關(guān)鍵概念理解 通知觀察者的方式 觀察者模式的實現(xiàn) 觀察者模式的優(yōu)缺點 使用場景 下面...
本文從jdk內(nèi)置的觀察者模式來介紹觀察者模式。業(yè)務(wù)場景:當老師進門的時候,班長帶頭叫老師好,然后全班同學(xué)一起交老師好因為太簡單,直接上代碼 班長繼承自O(shè)bservable package Observer; import java.util.Observable; import java.util.Observer; public class Monitor extends Observabl...
摘要:觀察者模式,是一對多的關(guān)系,一個主題對應(yīng)多個觀察者,當這個主題發(fā)生變化的時候,所有觀察著這個主題的觀察者都會接收到通知來獲悉主題的變化。這就是使用的觀察者模式,下面就讓我們用代碼實現(xiàn)觀察者模式。 觀察者模式,是一對多的關(guān)系,一個主題對應(yīng)多個觀察者,當這個主題發(fā)生變化的時候,所有觀察著這個主題的觀察者都會接收到通知來獲悉主題的變化。 在現(xiàn)實中我們也會遇到許許多多應(yīng)用觀察者模式的行為,比如...
閱讀 1317·2019-08-30 15:44
閱讀 2032·2019-08-30 13:49
閱讀 1661·2019-08-26 13:54
閱讀 3494·2019-08-26 10:20
閱讀 3271·2019-08-23 17:18
閱讀 3303·2019-08-23 17:05
閱讀 2137·2019-08-23 15:38
閱讀 1022·2019-08-23 14:35