最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java設(shè)計模式之觀察者模式簡單解讀

 更新時間:2023年10月25日 09:09:14   作者:歡歡2776479680  
這篇文章主要介紹了java設(shè)計模式之觀察者模式簡單解讀,觀察者模式是在對象之間定義了一對多的依賴,這樣一來,當一個對象改變狀態(tài),依賴它的對象會收到通知并自動更新,需要的朋友可以參考下

前言

首先,弄明白兩組概念: 觀察者(Observer)與被觀察者(subject)、發(fā)布者(publicsher)與訂閱者(subscriber)。這是相似的兩組概念,講的時候,要對應(yīng)于各自所在的組,不要弄混了。

在對象之間定義了一對多的依賴,這樣一來,當一個對象改變狀態(tài),依賴它的對象會收到通知并自動更新。(這和前端vue的思想相同) 觀察者模式說白了,其實就是發(fā)布訂閱模式,發(fā)布者發(fā)布信息,訂閱者獲取信息,訂閱了就能收到信息,沒訂閱就收不到信息。

思路

  • 抽象出觀察者接口
  • 抽象出被觀察者接口
  • 觀察者類實現(xiàn)觀察者接口
  • 被觀察者類實現(xiàn)被觀察者接口(被觀察者持有觀察者的一個隊列)

具體實現(xiàn)

實現(xiàn)時,可以不一步到位,在遇到問題的時候,你也許就知道該怎么做了

package com.wanmei.meishu.ms;

import java.util.ArrayList;
import java.util.List;

//觀察者接口
interface Observable{
	//觀察
	void addSub(ISubject sub);
	//取消觀察
	void removeSub(ISubject sub,String msg);
	//讀取消息
	void watch(String msg);
	//獲取觀察者名稱
	String getName();
}
//觀察者實例
class Observer implements Observable {
	private String name;
	public Observer(String name) {
		this.name = name;
	}
	@Override
	public void addSub(ISubject sub){
		sub.addObserver(this);
		System.out.println("Observer:用戶【"+this.name+"】 訂閱了消息");
	}
	@Override
	public void removeSub(ISubject sub,String msg){
		sub.removeObserver(this);
		System.out.println("Observer:用戶【"+this.name+"】 取消了訂閱消息," + (msg == null ? "" : ("并說:" + msg)));
	}
	@Override
	public void watch(String msg) {
		System.out.println("Observer:用戶【"+this.name+"】讀取到的訂閱消息是:" + msg);
	}
	
	public String getName() {
		return name;
	}
}

//被觀察者接口
interface ISubject{
	//給觀察者們發(fā)送消息
	void sendMsg(String msg);
	//添加一個觀察者
	void addObserver(Observable user);
	//取消一個觀察者
	void removeObserver(Observable user);
}

//被觀察者實現(xiàn)方式
class SubjectImpl implements ISubject{
	
	//持有觀察者隊列
	private List<Observable> observerList;

	//添加一個觀察者
	public synchronized void addObserver(Observable user){
		if(observerList == null){
			observerList = new ArrayList<Observable>();
		}
		observerList.add(user);
		String str = "";
		for (Observable observable : observerList) {
			str+= observable.getName()+"、";
		}
		System.out.println("ISubject:目前已有用戶:" + str.substring(0, str.length()-1));
	}
	//取消一個觀察者
	public void removeObserver(Observable user){
		observerList.remove(user);
		if(!observerList.isEmpty()){
			String str = "";
			for (Observable observable : observerList) {
				str+= observable.getName()+"、";
			}
			System.out.println("ISubject:目前剩余用戶:" + str.substring(0, str.length()- 1));
		}
	}
	@Override
	public void sendMsg(String msg) {
		if(!observerList.isEmpty()){
			System.out.println("ISubject:發(fā)送消息:" + msg);
			for (Observable observable : observerList) {
				observable.watch(msg);
			}
		}
	}
	
}

public class ObserverTest {

	public static void main(String[] args) {
		ISubject sub = new SubjectImpl();
		//第一個觀察者
		Observable u1 = new Observer("吳文俊");
		u1.addSub(sub);
		Observable u2 = new Observer("吳華云");
		u2.addSub(sub);
		Observable u3 = new Observer("李爪哇");
		u3.addSub(sub);
		sub.sendMsg("PHP是世界上最好的語言!");
		u3.removeSub(sub,"去死吧,PHP");
		sub.sendMsg("PHP是世界上最好的語言!");
		
		
	}
}

運行結(jié)果:

ISubject:目前已有用戶:吳文俊
Observer:用戶【吳文俊】 訂閱了消息
ISubject:目前已有用戶:吳文俊、吳華云
Observer:用戶【吳華云】 訂閱了消息
ISubject:目前已有用戶:吳文俊、吳華云、李爪哇
Observer:用戶【李爪哇】 訂閱了消息
ISubject:發(fā)送消息:PHP是世界上最好的語言!
Observer:用戶【吳文俊】讀取到的訂閱消息是:PHP是世界上最好的語言!
Observer:用戶【吳華云】讀取到的訂閱消息是:PHP是世界上最好的語言!
Observer:用戶【李爪哇】讀取到的訂閱消息是:PHP是世界上最好的語言!
ISubject:目前剩余用戶:吳文俊、吳華云
Observer:用戶【李爪哇】 取消了訂閱消息并說:去死吧,PHP
ISubject:發(fā)送消息:PHP是世界上最好的語言!
Observer:用戶【吳文俊】讀取到的訂閱消息是:PHP是世界上最好的語言!
Observer:用戶【吳華云】讀取到的訂閱消息是:PHP是世界上最好的語言!

到此這篇關(guān)于java設(shè)計模式之觀察者模式簡單解讀的文章就介紹到這了,更多相關(guān)java觀察者模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Cloud Feign簡單使用詳解

    Spring Cloud Feign簡單使用詳解

    本篇文章主要介紹了Spring Cloud Feign簡單使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • Spring?@EventListener?異步中使用condition的問題及處理

    Spring?@EventListener?異步中使用condition的問題及處理

    這篇文章主要介紹了Spring?@EventListener?異步中使用condition的問題及處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • java中final修飾符實例分析

    java中final修飾符實例分析

    本文通過實例向我們展示了java中final修飾符的概念,final修飾的基本變量和引用類型變量的區(qū)別。有需要的小伙伴可以參考下
    2014-11-11
  • Java?Stream流以及常用方法操作實例

    Java?Stream流以及常用方法操作實例

    Stream是對Java中集合的一種增強方式,使用它可以將集合的處理過程變得更加簡潔、高效和易讀,這篇文章主要介紹了Java?Stream流以及常用方法的相關(guān)資料,需要的朋友可以參考下
    2025-08-08
  • 一文讀懂Java多線程背后的故事

    一文讀懂Java多線程背后的故事

    Java是一種廣泛使用的編程語言,而多線程是Java程序員必不可少的一部分,Java的多線程支持具有確保數(shù)據(jù)同步、最大化利用CPU資源、并行處理任務(wù)等眾多優(yōu)點,本文從實際應(yīng)用場景出發(fā),為您詳細介紹 Java 多線程的各個方面的實際應(yīng)用及背景
    2023-06-06
  • 在java中實現(xiàn)C#語法里的按引用傳遞參數(shù)的方法

    在java中實現(xiàn)C#語法里的按引用傳遞參數(shù)的方法

    下面小編就為大家?guī)硪黄趈ava中實現(xiàn)C#語法里的按引用傳遞參數(shù)的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • spring的同一定時任務(wù)上一次的任務(wù)未結(jié)束前不會啟動這次任務(wù)問題

    spring的同一定時任務(wù)上一次的任務(wù)未結(jié)束前不會啟動這次任務(wù)問題

    這篇文章主要介紹了spring的同一定時任務(wù)上一次的任務(wù)未結(jié)束前不會啟動這次任務(wù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 簡單工廠模式_動力節(jié)點Java學院整理

    簡單工廠模式_動力節(jié)點Java學院整理

    這篇文章主要介紹了簡單工廠模式的相關(guān)資料,和大家一起學習靜態(tài)工廠方法模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • spring boot(一)之入門篇

    spring boot(一)之入門篇

    Spring Boot是由Pivotal團隊提供的全新框架,其設(shè)計目的是用來簡化新Spring應(yīng)用的初始搭建以及開發(fā)過程。接下來通過本文給大家介紹spring boot入門知識,需要的朋友參考下吧
    2017-05-05
  • springboot項目中全局設(shè)置用UTC+8

    springboot項目中全局設(shè)置用UTC+8

    本文主要介紹了springboot項目中全局設(shè)置用UTC+8,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04

最新評論

嵊泗县| 宁夏| 白水县| 平原县| 康定县| 铜陵市| 章丘市| 冷水江市| 廉江市| 通河县| 固镇县| 新郑市| 永昌县| 房山区| 河东区| 岳池县| 浏阳市| 屏东市| 德庆县| 潞城市| 洛扎县| 博白县| 翁牛特旗| 黔西县| 海原县| 通许县| 元阳县| 双辽市| 黄石市| 特克斯县| 平远县| 吴桥县| 应城市| 宜丰县| 綦江县| 皋兰县| 泌阳县| 诸城市| 绥滨县| 泉州市| 温州市|