iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >深入理解Java中观察者模式与委托的对比
  • 225
分享到

深入理解Java中观察者模式与委托的对比

2024-04-02 19:04:59 225人浏览 八月长安

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

摘要

目录代码背景观察者模式介绍实现观察者(学生)通知者(老师)Main方法观察者通知者 事件事件处理 委托 介绍 总结代码背景 一个班级,有两类学生,A类:

代码背景

一个班级,有两类学生,A类:不学习,玩,但是玩的东西不一样,有的是做游戏,有的是看电视

B类:放哨的学生,专门看老师的动向,如果老师进班了就立即通知大家。

如此就形成了一个需求,放哨的学生要通知所有玩的学生:老师来了,而不同的学生有不同的反应,有的马上把电视关闭,有的停止玩游戏。

观察者模式

介绍

观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。
这个主题对象在状态发生变化时,会通知所有的观察者对象,使他们能够自动更新自己。

主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。

何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。

如何解决:使用面向对象技术,可以将这种依赖关系弱化。

关键代码:在抽象类里有一个 ArrayList 存放观察者们。

实现

观察者(学生)


public interface Observer {
    public abstract void updateState();
}

public class ConcreteObserver implements Observer{
    //观察者的姓名
    private String name;
    //观察者的状态
    private String observerState;
    //明确具体的通知者
    private ConcreteSubject subject;
   //get set方法省略
    public ConcreteObserver(String name, ConcreteSubject subject) {
        this.name = name;
        this.subject = subject;
    }
    @Override
    public void updateState() {
        observerState=subject.getSubjectState();
        System.out.println(name+"在打游戏");
        String str=String.fORMat("观察者%s的:新状态是%s", name,observerState);
        System.out.println(str);
    }
}

public class ConcreteObserver2 implements Observer{
    //观察者的姓名
    private String name;
    //观察者的状态
    private String observerState;
    //明确具体的通知者
    private ConcreteSubject subject;
   //get set方法省略
    public ConcreteObserver2(String name, ConcreteSubject subject) {
        this.name = name;
        this.subject = subject;
    }
    @Override
    public void updateState() {
        observerState=subject.getSubjectState();
        System.out.println(name+"在看电视");
        String str=String.format("观察者%s:新状态是%s", name,observerState);
        System.out.println(str);
    }
}

通知者(老师)


public abstract class Subject {
    //管理观察者的集合
    private List<Observer> observers=new ArrayList<>();
    //增加观察者
    public void add(Observer observer){
        observers.add(observer);
    }
    //减少观察者
    public void detach(Observer observer){
        observers.remove(observer);
    }
    
    public void notifyMsg(){
        for (Observer observer : observers) {
            observer.updateState();
        }
    }
}

public class ConcreteSubject extends Subject {
    //通知者的状态
    private String subjectState;
    //get set方法
    public String getSubjectState() {
        return subjectState;
    }
    public void setSubjectState(String subjectState) {
        this.subjectState = subjectState;
    }
}

Main方法


public class MainTest {
    public static void main(String[] args) {
        //创建一个主题/通知者
        ConcreteSubject subject=new ConcreteSubject();
        //new出观察者(学生)
        ConcreteObserver studentZhang = new ConcreteObserver("小张", subject);
        ConcreteObserver studentLiu = new ConcreteObserver("小刘", subject);
        ConcreteObserver studentWang = new ConcreteObserver("小王", subject);
        //将观察者添加到通知队列里
        subject.add(studentZhang);
        subject.add(studentLiu);
        subject.add(studentWang);
        //通知者(老师)状态修改,通知每个学生
        subject.setSubjectState("老师回来了,我要好好学习");
        subject.notifyMsg();
        System.out.println("-----------");
    }
}

 委托 介绍

委托可以看做是函数的抽象,是函数的“类”。委托的实例将代表一个具体的函数
一个委托可以搭载多个方法,所有的方法被依次唤起。可以使委托对象所搭载的方法并不需要属于同一类。
委托事件模型可以由三个组件定义:事件、事件源和事件侦听器。

委托的实现简单来讲就是用反射来实现的。

实现

观察者


public class PlayingGameListener {
    public PlayingGameListener(){
        System.out.println("我正在玩游戏 开始时间"+new Date());
    }
    public void stopPlayingGame(Date date){
        System.out.println("老师来了,快回到座位上,结束时间"+date);
    }
}

public class WatchingTVListener {
    public WatchingTVListener(){
        System.out.println("我正在看电视 "+new Date());
    }
    public void stopWatchingTV(Date date){
        System.out.println("老师来了,快关闭电视 。 结束时间"+date);
    }
}

通知者


public abstract class Notifier {
    //每个通知者都有一个需要通知的队列(通知:对象、方法、参数)
    private EventHandler eventHandler=new EventHandler();
    public EventHandler getEventHandler() {
        return eventHandler;
    }
    public void setEventHandler(EventHandler eventHandler) {
        this.eventHandler = eventHandler;
    }
    //增加需要帮忙放哨的学生
    public abstract void addListener(Object object,String methodName,Object...args);
    //告诉所有要帮忙放哨的学生:老师来了
    public abstract void notifyX();
}

public class GoodNotifier extends Notifier {
    @Override
    public void addListener(Object object, String methodName, Object...args) {
        System.out.println("有新的同学委托尽职尽责的放哨人!");
        this.getEventHandler().addEvent(object, methodName, args);
    }
    @Override
    public void notifyX() {
        System.out.println("尽职尽责的放哨人告诉所有需要帮忙的同学:老师来了");
        try{
            //优化:异步通知
            this.getEventHandler().notifyX();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

 事件


public class Event {
    //要执行方法的对象
    private Object object;
    //要执行的方法名称
    private String methodName;
    //要执行方法的参数
    private Object[] params;
    //要执行方法的参数类型
    private Class[] paramTypes;
    //若干setter getter
    public Object getObject() {
        return object;
    }
    public String getMethodName() {
        return methodName;
    }
    public void setMethodName(String methodName) {
        this.methodName = methodName;
    }
    public Object[] getParams() {
        return params;
    }
    public void setParams(Object[] params) {
        this.params = params;
    }
    public Class[] getParamTypes() {
        return paramTypes;
    }
    public void setParamTypes(Class[] paramTypes) {
        this.paramTypes = paramTypes;
    }
    public Event(){
    }
    public Event(Object object,String methodName,Object...args){
        this.object=object;
        this.methodName=methodName;
        this.params=args;
        contractParamTypes(this.params);
    }
    //根据参数数组生成参数类型数组
    private void contractParamTypes(Object[] params){
        this.paramTypes=new Class[params.length];
        for(int i=0;i<params.length;i++){
            this.paramTypes[i]=params[i].getClass();
        }
    }
    //执行该 对象的该方法
    public void invoke() throws Exception{
        //通过class,method,paramTypes 确定执行哪个类的哪个方法
        Method method=object.getClass().getMethod(this.getMethodName(), this.getParamTypes());
        if(null==method){
            return;
        }
        //方法执行
        method.invoke(this.getObject(), this.getParams());
    }
}

事件处理


public class EventHandler {
    //是用一个List
    private List<Event> objects;
    //添加某个对象要执行的事件,及需要的参数
    public void addEvent(Object object,String methodName,Object...args){
        objects.add(new Event(object,methodName,args));
    }
    public EventHandler(){
        objects=new ArrayList<Event>();
    }
    //通知所有的对象执行指定的事件
    public void notifyX() throws Exception{
        for(Event e : objects){
            e.invoke();
        }
    }
}

Main方法


public class EventMain {
    public static void main(String[] args) {
        //创建一个尽职尽责的放哨者
        Notifier goodNotifier = new GoodNotifier();
        //创建一个玩游戏的同学,开始玩游戏
        PlayingGameListener playingGameListener = new PlayingGameListener();
        //创建一个看电视的同学,开始看电视
        WatchingTVListener watchingTVListener = new WatchingTVListener();
        //玩游戏的同学告诉放哨的同学,老师来了告诉一下
        goodNotifier.addListener(playingGameListener, "stopPlayingGame", new Date());
        //看电视的同学告诉放哨的同学,老师来了告诉一下
        goodNotifier.addListener(watchingTVListener, "stopWatchingTV", new Date());
        try {
            //一点时间后
            Thread.sleep(1000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //老师出现,放哨的人通知所有要帮忙的同学:老师来了
        goodNotifier.notifyX();
    }
}

 总结

1.先有观察者模式后有委托事件技术
2.观察者模式只能通知继承 Observer类 的子类,也可以将Observer改成接口

for (Observer observer : observers) {
        observer.updateState();
}

3.委托可以通知任何类的任何方法。反射、everone

 Method method=object.getClass().getMethod(this.getMethodName(), this.getParamTypes());
if(null==method){
        return;
}
 method.invoke(this.getObject(), this.getParams());

4.委托与观察者比多了一个事件执行者,解除观察者与通知者的耦合,可以做到通知任何对象的任何方法。让A类学生和B类学生完全解耦,即A类完全不知道B类的学生,却可以通知B类的学生

6.建立一套触发机制,可以使用异步通知

7.观察者/委托挺像MQ里边的订阅发布。生产者、队列、消费者。

到此这篇关于Java中观察者模式与委托的对比的文章就介绍到这了,更多相关Java观察者模式委托内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 深入理解Java中观察者模式与委托的对比

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 深入理解Java中观察者模式与委托的对比
    目录代码背景观察者模式介绍实现观察者(学生)通知者(老师)Main方法观察者通知者 事件事件处理 委托 介绍 总结代码背景 一个班级,有两类学生,A类:...
    99+
    2024-04-02
  • Java中观察者模式与委托的实例对比分析
    这篇文章主要介绍“Java中观察者模式与委托的实例对比分析”,在日常操作中,相信很多人在Java中观察者模式与委托的实例对比分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中观察者模式与委托的实例对...
    99+
    2023-06-30
  • Java观察者模式的深入了解
    目录一、观察者模式的定义和特点二、观察者模式的结构三、代码实例代码示例总结一、观察者模式的定义和特点 观察者模式的定义: 指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时...
    99+
    2024-04-02
  • 深入理解Java设计模式之观察者模式
    目录一、什么是观察者模式二、观察者模式的结构三、观察者模式的使用场景使用观察者模式也有两个重点问题要解决:广播链的问题。异步处理问题。四、观察者模式的优缺点五、观察者模式的实现六、观...
    99+
    2024-04-02
  • 详解Java中的观察者模式
    详解Java中的观察者模式?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。定义:定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更...
    99+
    2023-05-31
    java 观察 观察者模式
  • 怎么理解Java设计模式的观察者模式
    本篇内容介绍了“怎么理解Java设计模式的观察者模式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、什么是观察者模式在许多设计中,经常涉及...
    99+
    2023-06-25
  • Java设计模式中的观察者模式
    目录一.介绍二.场景约束三.UML类图四.示意代码(版本一)五.示意代码(版本二)六.观察者模式与发布订阅模式七.优点八.在JDK中的典型应用一.介绍 观察者模式(Observer ...
    99+
    2023-02-16
    Java观察者模式 Java设计模式
  • C#中的EventHandler观察者模式详解
    目录一、解释二、事件具有以下特点:C# 和 java 比较:java 中使用的是接口。C# 使用委托机制,可以用时 + 运算符进行注册,直接多播。而 java 中是一般是使用一个集合...
    99+
    2024-04-02
  • Java设计模式中的观察者模式怎样的
    今天就跟大家聊聊有关Java设计模式中的观察者模式怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、观察者模式的定义和特点观察者模式的定义:指多个对象间存在一对多的依赖关系,当...
    99+
    2023-06-22
  • java和Spring中观察者模式的应用详解
    目录一、观察者模式基本概况1.概念2.作用3.实现方式二、java实现两种观察者模式1.Observer接口和Observable类2.EventObject和EventListen...
    99+
    2024-04-02
  • Java中常用的设计模式之观察者模式详解
    目录优点缺点使用场景注意事项一、实现方式1、观察者抽象类2、第一个观察者3、第二个观察者4、第三个观察者5、定义主题二、测试总结优点 1.观察者和被观察者是抽象耦合的。 2.建立一套...
    99+
    2024-04-02
  • Java编程中的观察者模式是什么
    这篇文章主要介绍“Java编程中的观察者模式是什么”,在日常操作中,相信很多人在Java编程中的观察者模式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java编程中的观察者模式是什么”的疑惑有所帮助!...
    99+
    2023-05-30
    java
  • 深入理解C#中常见的委托
    目录C#之委托1.定义一个委托:2.定义回调方法:3.编写一个方法来触发回调函数:4.定义Counter的方法调用5. 查看控制台信息6. 委托链:7. C#为委托提供的简化:7.1...
    99+
    2024-04-02
  • JS中自定义事件与观察者模式详解
    目录一、前言二、观察者模式优缺点三、代码实现四、DOM自定义事件API一、前言 观察者模式 也称发布-订阅模式 、 模型-视图模式 。当对象间存在一对多关系时,则使用观察者模式(Ob...
    99+
    2024-04-02
  • 深入理解Java设计模式之外观模式
    目录一、什么是外观模式二、外观模式的使用场景三、外观模式的优缺点四、外观模式的实现总结一、什么是外观模式 定义:为子系统中的一组接口提供一个一致的界面,用来访问子系统中的一群接口。 ...
    99+
    2024-04-02
  • JAVA观察者模式的的讲解及代码实现
    目录概念组成 实现 总结 概念 观察者模式又叫做发布-订阅模式,是对象间的一对多的关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动...
    99+
    2024-04-02
  • Java观察者模式之实现对象间的一对多依赖
    目录一、介绍1.1 什么是Java观察者模式?1.2 观察者模式的优缺点二、实现步骤2.1 创建被观察者类2.2 创建观察者接口和实现类2.3 在被观察者类中添加注册、移除和通知观察...
    99+
    2023-05-19
    Java观察者模式 对象间一对多依赖 Java观察者模式一对多依赖
  • VUE 观察者:深入理解数据绑定的工作原理
    Vue.js 中的观察者模式是响应式系统的重要组成部分,它允许组件自动更新视图,而无需手动操作。这使得 Vue.js 成为开发交互式界面的理想选择。 观察者模式是一个发布-订阅模式,其中数据对象充当发布者,而组件充当订阅者。当发布者(数...
    99+
    2024-02-10
    Vue.js Observer 数据绑定 响应性 性能优化
  • 深入理解Java设计模式之中介者模式
    目录一、什么是中介者模式二、中介者模式的结构三、中介者模式的优缺点四、中介者模式的使用场景五、中介者模式与发布/订阅模式的异同六、中介者模式的实现结果总结一、什么是中介者模式 用一个...
    99+
    2024-04-02
  • JavaScript观察者模式:深入剖析,掌握事件驱动的艺术
    观察者模式是一种设计模式,它可以让你创建松散耦合的系统。在松散耦合的系统中,对象可以独立于彼此更改。这使得观察者模式非常适合于构建复杂的系统,这些系统需要能够轻松地扩展和更改。 观察者模式的工作原理如下: 首先,你需要创建一个被观察者...
    99+
    2024-02-03
    设计模式 JavaScript 观察者模式 事件处理
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作