返回顶部
首页 > 资讯 > 后端开发 > Python >Java通俗易懂系列设计模式之观察者模式
  • 655
分享到

Java通俗易懂系列设计模式之观察者模式

2024-04-02 19:04:59 655人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录介绍观察者模式Java示例Java观察者模式类图适用场景介绍 观察者模式是行为设计模式之一。当您对对象的状态感兴趣并希望在有任何更改时收到通知时,观察者设计模式非常有用。在观察者

介绍

观察者模式是行为设计模式之一。当您对对象的状态感兴趣并希望在有任何更改时收到通知时,观察者设计模式非常有用。在观察者模式中,监视另一个对象状态的对象称为Observer,正在被监视的对象称为Subject。

根据GoF,观察者设计模式的意图是;

定义对象之间的一对多依赖关系,以便当一个对象更改状态时,将自动通知和更新其所有依赖项。

Subject包含一个观察者列表,用于通知其状态的任何变化,因此它应该提供观察者可以注册和注销自己的方法。Subject还包含一种方法,用于通知所有观察者任何更改,并且可以在通知观察者时发送更新,或者它可以提供另一种方法来获取更新。

Observer应该有一个方法来设置要监视的对象,以及Subject将使用的另一个方法来通知它们任何更新。
Java提供了内置平台,用于通过java.util.Observable类和java.util.Observer接口实现Observer模式。但是它没有被广泛使用,因为实现非常简单,并且大多数时候我们不希望最终扩展类只是为了实现Observer模式,因为java不在类中提供多重继承。

Java消息服务(JMS)使用Observer设计模式以及Mediator模式,允许应用程序订阅数据并将数据发布到其他应用程序。

模型 - 视图 - 控制器(mvc框架也使用Observer模式,其中Model是Subject,而Views是观察者,可以注册以获得对模型的任何更改的通知。

观察者模式Java示例

对于我们的观察者模式java程序示例,我们将实现一个简单的Subject,观察者可以注册到这个Subject。每当有任何新消息发布到Subject时,将通知所有寄存器观察者并且他们可以使用该消息。

根据Subject的要求,这里是基础Subject接口,它定义了由任何具体Subject实现的契约方法。


package com.journaldev.design.observer;

public interface Subject {

	//methods to reGISter and unregister observers
	public void register(Observer obj);
	public void unregister(Observer obj);
	
	//method to notify observers of change
	public void notifyObservers();
	
	//method to get updates from subject
	public Object getUpdate(Observer obj);
	
}

接下来我们将为Observer创建契约,将有一个方法将Subject附加到观察者,以及Subject要用来通知任何更改的另一个方法。


package com.journaldev.design.observer;

public interface Observer {
	
	//method to update the observer, used by subject
	public void update();
	
	//attach with subject to observe
	public void setSubject(Subject sub);
}

现在我们的契约准备好了,让我们继续我们Subject的具体实施。


package com.journaldev.design.observer;

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

public class MyTopic implements Subject {

	private List<Observer> observers;
	private String message;
	private boolean changed;
	private final Object MUTEX= new Object();
	
	public MyTopic(){
		this.observers=new ArrayList<>();
	}
	@Override
	public void register(Observer obj) {
		if(obj == null) throw new NullPointerException("Null Observer");
		synchronized (MUTEX) {
		if(!observers.contains(obj)) observers.add(obj);
		}
	}

	@Override
	public void unregister(Observer obj) {
		synchronized (MUTEX) {
		observers.remove(obj);
		}
	}

	@Override
	public void notifyObservers() {
		List<Observer> observersLocal = null;
		//synchronization is used to make sure any observer registered after message is received is not notified
		synchronized (MUTEX) {
			if (!changed)
				return;
			observersLocal = new ArrayList<>(this.observers);
			this.changed=false;
		}
		for (Observer obj : observersLocal) {
			obj.update();
		}

	}

	@Override
	public Object getUpdate(Observer obj) {
		return this.message;
	}
	
	//method to post message to the topic
	public void postMessage(String msg){
		System.out.println("Message Posted to Topic:"+msg);
		this.message=msg;
		this.changed=true;
		notifyObservers();
	}

}

注册和取消注册观察者的方法实现非常简单,额外的方法是postMessage(),户端应用程序将使用它将String消息发布到主题。请注意布尔变量,以跟踪主题状态的变化并用于通知观察者。此变量是必需的,因此如果没有更新并且某人调用notifyObservers(),则它不会向观察者发送错误通知。

还要注意在notifyObservers()方法中使用同步,以确保仅将通知发送给在将消息发布到主题之前注册的观察者。

以下是将观察主题的观察者的实施。


package com.journaldev.design.observer;

public class MyTopicSubscriber implements Observer {
	
	private String name;
	private Subject topic;
	
	public MyTopicSubscriber(String nm){
		this.name=nm;
	}
	@Override
	public void update() {
		String msg = (String) topic.getUpdate(this);
		if(msg == null){
			System.out.println(name+":: No new message");
		}else
		System.out.println(name+":: Consuming message::"+msg);
	}

	@Override
	public void setSubject(Subject sub) {
		this.topic=sub;
	}

}

注意update()方法的实现,它调用Subject getUpdate()方法来获取要使用的消息。我们可以通过将message作为参数传递给update()方法来避免这种调用。

这是一个简单的测试程序,用于使用我们的Subject主题实现。


package com.journaldev.design.observer;

public class ObserverPatternTest {

	public static void main(String[] args) {
		//create subject
		MyTopic topic = new MyTopic();
		
		//create observers
		Observer obj1 = new MyTopicSubscriber("Obj1");
		Observer obj2 = new MyTopicSubscriber("Obj2");
		Observer obj3 = new MyTopicSubscriber("Obj3");
		
		//register observers to the subject
		topic.register(obj1);
		topic.register(obj2);
		topic.register(obj3);
		
		//attach observer to subject
		obj1.setSubject(topic);
		obj2.setSubject(topic);
		obj3.setSubject(topic);
		
		//check if any update is available
		obj1.update();
		
		//now send message to subject
		topic.postMessage("New Message");
	}

}

当我们运行上面的程序时,我们得到以下输出。

Obj1:: No new message

Message Posted to Topic:New Message

Obj1:: Consuming message::New Message

Obj2:: Consuming message::New Message

Java观察者模式类图

观察者设计模式也称为发布 - 订阅模式。其中一些实现是:

  • Swing中的java.util.EventListener
  • javax.servlet.Http.httpsessionBindingListener
  • javax.servlet.http.HttpSessionAttributeListener
  • java.util.Observerjava.util.EventListener
  • javax.servlet.http.HttpSessionBindingListener

适用场景

在以下任何一种情况下使用Observer模式

  • 在一个对象中进行更改会导致其他对象发生更改
  • 当抽象有两个方面时,一个依赖于另一个。将这些方面封装在单独的对象中可让您独立地改变和重用它们。
  • 当一个对象的更改需要更改其他对象时,您不知道需要更改多少个对象。
  • 当一个对象应该能够通知其他对象而不假设这些对象是谁。换句话说,您不希望这些对象紧密耦合。

以上就是Java通俗易懂系列设计模式之观察者模式的详细内容,更多关于Java设计模式的资料请关注编程网其它相关文章!

--结束END--

本文标题: Java通俗易懂系列设计模式之观察者模式

本文链接: https://lsjlt.com/news/124371.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java通俗易懂系列设计模式之观察者模式
    目录介绍观察者模式Java示例Java观察者模式类图适用场景介绍 观察者模式是行为设计模式之一。当您对对象的状态感兴趣并希望在有任何更改时收到通知时,观察者设计模式非常有用。在观察者...
    99+
    2024-04-02
  • Java通俗易懂系列设计模式之建造者模式
    目录介绍意图定义实例使用场景JDK中的Builder设计模式示例总结介绍 今天我们将研究java中的Builder模式。Builder 设计模式是一种创造性的设计模式,如工厂模式和抽...
    99+
    2024-04-02
  • Java通俗易懂系列设计模式之模板模式
    目录介绍实现总结实际开发中常常会遇到,代码骨架类似甚至相同,只是具体的实现不一样的场景。例如:流程都有开启、编辑、驳回、结束。每个流程都包含这几个步骤,不同的是不同的流程实例它们的内...
    99+
    2024-04-02
  • Java通俗易懂系列设计模式之装饰模式
    目录介绍实现类图总结介绍 装饰模式,是面向对象编程领域中,一种动态地往一个类中添加新的行为的设计模式。就功能而言,装饰模式相比生成子类更为灵活,这样可以给某个对象而不是整个类添加一些...
    99+
    2024-04-02
  • Java通俗易懂系列设计模式之代理模式
    目录前言介绍实现一.静态代理二.Jdk动态代理三.Cglib动态代理总结前言 国内程序员好像普遍对百度都没好感,而且百度近些年产生了不少负面的新闻,像16年的魏则西事件,近期的导演吴...
    99+
    2024-04-02
  • Java通俗易懂系列设计模式之策略模式
    目录介绍实例类图总结介绍 策略设计模式是行为设计模式之一。当我们为特定任务使用多个算法时,使用策略模式,客户端决定在运行时使用的实际实现。 策略模式的最佳示例之一是Collecti...
    99+
    2024-04-02
  • Java通俗易懂系列设计模式之适配器模式
    目录介绍结构类图对象适配器类适配器实例类适配器实现对象适配器实现测试demo类适用场景总结今天看了部特工电影,里面有个桥段,主角在直升机上和反派生死搏斗,而飞机则是无人驾驶的状态,有...
    99+
    2024-04-02
  • Java通俗易懂系列设计模式之责任链模式
    目录概述JDK中的责任链模式示例责任链设计模式示例责任链设计模式 - 基类和接口责任链模式 - 链实现责任链设计模式 - 创建链责任链设计模式类图责任链设计模式重点JDK中的责任链模...
    99+
    2024-04-02
  • Java设计模式之观察者模式
    目录一、观察者模式的定义和特点二、观察者模式的结构三、代码实例代码示例总结 一、观察者模式的定义和特点 观察者模式的定义: 指多个对象间存在一对多的依赖关系,当一个对象的状态发生改...
    99+
    2024-04-02
  • Java设计模式之观察者模式(Observer模式)
    目录一、观察者模式是什么?二、模式分析2.1 四个角色2.2 案例三、观察者模式的优缺点四、总结一、观察者模式是什么? 当对象间存在一对多关系时,则使用观察者模式(Observer ...
    99+
    2024-04-02
  • Java设计模式之java观察者模式详解
    目录引言介绍角色原理类图微信订阅号的案例总结优点缺点适用场景观察者模式的典型应用JDK 提供的观察者接口Guava EventBus 中的观察者模式Spring Applicatio...
    99+
    2024-04-02
  • Java设计模式中的观察者模式
    目录一.介绍二.场景约束三.UML类图四.示意代码(版本一)五.示意代码(版本二)六.观察者模式与发布订阅模式七.优点八.在JDK中的典型应用一.介绍 观察者模式(Observer ...
    99+
    2023-02-16
    Java观察者模式 Java设计模式
  • 设计模式-观察者模式(Observer)
    讲故事(user story) 假设我们是一个优惠券提供平台,故事就发生在顾客在我们平台采购完成支付成功后。 支付完成后平台要进行的一些操作: 短信通知客户已经生成订单 增加顾客的积分 开始按订单需求制券 ​ ...
    99+
    2018-06-15
    设计模式-观察者模式(Observer)
  • PHP设计模式(观察者模式)
    PHP 设计模式之观察者模式 介绍 现在有两派,有的人建议使用设计模式,有的人不建议使用设计模式! 这就向写文章一样,有的人喜欢文章按照套路走,比如叙事性质的文章,时间,地点,人物,...
    99+
    2024-04-02
  • 深入理解Java设计模式之观察者模式
    目录一、什么是观察者模式二、观察者模式的结构三、观察者模式的使用场景使用观察者模式也有两个重点问题要解决:广播链的问题。异步处理问题。四、观察者模式的优缺点五、观察者模式的实现六、观...
    99+
    2024-04-02
  • Java设计模式探究之观察者模式详解
    目录1.观察者模式是什么2.如何实现3.代码实现1)观察者接口2)被观察者接口3)观察者实现4)被观察者实现5)测试类4.延伸拓展1.观察者模式是什么 顾名思义,有两个对象,观察者和...
    99+
    2024-04-02
  • PHP设计模式之观察者模式浅析
    目录PHP观察者模式(Observer Pattern)模式结构实现步骤代码示例适用场景PHP观察者模式(Observer Pattern) 观察者模式是一种行为设计模式,它定义了一...
    99+
    2023-05-14
    PHP观察者模式 PHP 设计模式 观察者模式
  • python面试题——设计模式之观察者模式
    1、观察者模式 观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 观察者模式又称:"发布-订阅"模式。 比如,微信公众号,就是一种...
    99+
    2023-09-12
    python 设计模式 观察者模式
  • Java中常用的设计模式之观察者模式详解
    目录优点缺点使用场景注意事项一、实现方式1、观察者抽象类2、第一个观察者3、第二个观察者4、第三个观察者5、定义主题二、测试总结优点 1.观察者和被观察者是抽象耦合的。 2.建立一套...
    99+
    2024-04-02
  • JavaScript设计模式中的观察者模式
    目录观察者设计模式初始数据被观察者观察者观察者设计模式 观察者设计模式中分为被观察者和观察者,当被观察者触发了某个边界条件,观察者就会触发事件,这里需要俩个构造函数进行观察者设计模式...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作