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