java设计模式之观察者模式简单解读

 更新时间:2023年10月25日 09:09:14   作者:欢欢2776479680  
这篇文章主要介绍了java设计模式之观察者模式简单解读,观察者模式是在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新,需要的朋友可以参考下

前言

首先,弄明白两组概念: 观察者(Observer)与被观察者(subject)、发布者(publicsher)与订阅者(subscriber)。这是相似的两组概念,讲的时候,要对应于各自所在的组,不要弄混了。

在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。(这和前端vue的思想相同) 观察者模式说白了,其实就是发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。

思路

  • 抽象出观察者接口
  • 抽象出被观察者接口
  • 观察者类实现观察者接口
  • 被观察者类实现被观察者接口(被观察者持有观察者的一个队列)

具体实现

实现时,可以不一步到位,在遇到问题的时候,你也许就知道该怎么做了

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{
	//给观察者们发送消息
	void sendMsg(String msg);
	//添加一个观察者
	void addObserver(Observable user);
	//取消一个观察者
	void removeObserver(Observable user);
}

//被观察者实现方式
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:发送消息:" + 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是世界上最好的语言!");
		
		
	}
}

运行结果:

ISubject:目前已有用户:吴文俊
Observer:用户【吴文俊】 订阅了消息
ISubject:目前已有用户:吴文俊、吴华云
Observer:用户【吴华云】 订阅了消息
ISubject:目前已有用户:吴文俊、吴华云、李爪哇
Observer:用户【李爪哇】 订阅了消息
ISubject:发送消息:PHP是世界上最好的语言!
Observer:用户【吴文俊】读取到的订阅消息是:PHP是世界上最好的语言!
Observer:用户【吴华云】读取到的订阅消息是:PHP是世界上最好的语言!
Observer:用户【李爪哇】读取到的订阅消息是:PHP是世界上最好的语言!
ISubject:目前剩余用户:吴文俊、吴华云
Observer:用户【李爪哇】 取消了订阅消息并说:去死吧,PHP
ISubject:发送消息:PHP是世界上最好的语言!
Observer:用户【吴文俊】读取到的订阅消息是:PHP是世界上最好的语言!
Observer:用户【吴华云】读取到的订阅消息是:PHP是世界上最好的语言!

到此这篇关于java设计模式之观察者模式简单解读的文章就介绍到这了,更多相关java观察者模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Cloud Feign简单使用详解

    Spring Cloud Feign简单使用详解

    本篇文章主要介绍了Spring Cloud Feign简单使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • Spring @EventListener 异步中使用condition的问题及处理

    Spring @EventListener 异步中使用condition的问题及处理

    这篇文章主要介绍了Spring @EventListener 异步中使用condition的问题及处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • java中final修饰符实例分析

    java中final修饰符实例分析

    本文通过实例向我们展示了java中final修饰符的概念,final修饰的基本变量和引用类型变量的区别。有需要的小伙伴可以参考下
    2014-11-11
  • Java Stream流以及常用方法操作实例

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

    Stream是对Java中集合的一种增强方式,使用它可以将集合的处理过程变得更加简洁、高效和易读,这篇文章主要介绍了Java Stream流以及常用方法的相关资料,需要的朋友可以参考下
    2025-08-08
  • 一文读懂Java多线程背后的故事

    一文读懂Java多线程背后的故事

    Java是一种广泛使用的编程语言,而多线程是Java程序员必不可少的一部分,Java的多线程支持具有确保数据同步、最大化利用CPU资源、并行处理任务等众多优点,本文从实际应用场景出发,为您详细介绍 Java 多线程的各个方面的实际应用及背景
    2023-06-06
  • 在java中实现C#语法里的按引用传递参数的方法

    在java中实现C#语法里的按引用传递参数的方法

    下面小编就为大家带来一篇在java中实现C#语法里的按引用传递参数的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • spring的同一定时任务上一次的任务未结束前不会启动这次任务问题

    spring的同一定时任务上一次的任务未结束前不会启动这次任务问题

    这篇文章主要介绍了spring的同一定时任务上一次的任务未结束前不会启动这次任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 简单工厂模式_动力节点Java学院整理

    简单工厂模式_动力节点Java学院整理

    这篇文章主要介绍了简单工厂模式的相关资料,和大家一起学习静态工厂方法模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • spring boot(一)之入门篇

    spring boot(一)之入门篇

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。接下来通过本文给大家介绍spring boot入门知识,需要的朋友参考下吧
    2017-05-05
  • springboot项目中全局设置用UTC+8

    springboot项目中全局设置用UTC+8

    本文主要介绍了springboot项目中全局设置用UTC+8,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04

最新评论