热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

设计模式系列:观察者模式

一.名称二.问题(为了解决什么问题)很好辨认,举一些常见的例子:猫鼠游戏广播收音机事件监听等等三.解决方案࿰

一.名称

二.问题(为了解决什么问题)

很好辨认,举一些常见的例子:
猫鼠游戏
广播收音机
事件监听等等

三.解决方案(主要体现在uml和核心代码上)

定义:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。

其实观察者模式的更细节的1对1就是接口回调。

扩展:
java中已经帮我们定义了观察者和被观察者的接口,我们只需要直接实现即可。

观察者模式体现了:迪米特原则、开闭原则、里氏替换原则、依赖倒置原则
因为实现了类间解耦——迪米特原则
因为使用了抽象类——开闭原则
因为使用了抽象类——里氏替换原则
因为使用了抽象类和继承——依赖倒置原则

这里写图片描述

四.例子

李斯、李四观察韩非子
被观察者基类

/*** Created by annuoaichengzhang on 16/3/22.*/
public interface Observable {public void addObserver(Observer observer);public void deleteObserver(Observer observer);public void notifyObservers(String context);
}

被观察者

/*** Created by annuoaichengzhang on 16/3/22.*/
public class HanFeiZi implements Observable {private ArrayList observers &#61; new ArrayList<>();&#64;Overridepublic void addObserver(Observer observer) {this.observers.add(observer);}&#64;Overridepublic void deleteObserver(Observer observer) {this.observers.remove(observer);}&#64;Overridepublic void notifyObservers(String context) {for (Observer observer : observers) {observer.update(context);}}public void haveBreakfast() {System.out.println("韩非子:开始吃饭了");// 通知所有的观察者this.notifyObservers("韩非子在吃饭");}
}

观察者基类

/*** Created by annuoaichengzhang on 16/3/22.*/
public interface Observer {public void update(String context);}

观察者1

/*** Created by annuoaichengzhang on 16/3/22.*/
public class LiSi implements Observer {&#64;Overridepublic void update(String context) {System.out.println("李斯:观察到韩非子在活动");}
}

观察者2

/*** Created by annuoaichengzhang on 16/3/22.*/
public class WangSi implements Observer {&#64;Overridepublic void update(String context) {System.out.println("王思:韩非子在行动");}
}

client

/*** Created by annuoaichengzhang on 16/3/22.*/
public class Client {public static void main(String[] args) {Observer lisi &#61; new LiSi();Observer wangsi &#61; new WangSi();HanFeiZi hanFeiZi &#61; new HanFeiZi();hanFeiZi.addObserver(lisi);hanFeiZi.addObserver(wangsi);hanFeiZi.haveBreakfast();}
}

使用java内置的接口

/*** Created by annuoaichengzhang on 16/3/22.*/
public class HanFeiZi extends Observable {public void haveBreakfast() {System.out.println("韩非子:开始吃饭了");// 通知所有的观察者this.notifyObservers("韩非子在吃饭");}
}

/*** Created by annuoaichengzhang on 16/3/22.*/
public class LiSi implements Observer {&#64;Overridepublic void update(String context) {System.out.println("李斯:观察到韩非子在活动");}
}

简单了很多~~

四.效果&#xff08;有啥优缺点&#xff09;

这里写图片描述

常见案例

联机对战游戏。在游戏中&#xff0c;多个玩家可以加入同一战队组成联盟&#xff0c;当战队中某一成员受到敌人攻击时将给所有其他盟友发送通知&#xff0c;盟友受到通知后将作出响应。

股票交易系统。某股票变化幅度在5%左右时&#xff0c;系统将自动发送通知给购买该股票的股民。


推荐阅读
  • 本文详细介绍了装饰者(Decorator)模式,这是一种动态地为对象添加职责的方法。与传统的继承方式不同,装饰者模式通过组合而非继承来实现功能扩展,从而提供更大的灵活性和可维护性。 ... [详细]
  • 深入解析 Android IPC 中的 Messenger 机制
    本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ... [详细]
  • java文本编辑器,java文本编辑器设计思路
    java文本编辑器,java文本编辑器设计思路 ... [详细]
  • 本文介绍了如何利用Apache Digester库解决硬编码问题,通过创建自定义配置文件(如Struts配置文件)来动态调整应用程序的行为。文章详细描述了使用Apache Digester将XML文档转换为Java Bean对象的过程,并提供了具体的实现步骤。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • 深入解析动态代理模式:23种设计模式之三
    在设计模式中,动态代理模式是应用最为广泛的一种代理模式。它允许我们在运行时动态创建代理对象,并在调用方法时进行增强处理。本文将详细介绍动态代理的实现机制及其应用场景。 ... [详细]
  • 并发编程 12—— 任务取消与关闭 之 shutdownNow 的局限性
    Java并发编程实践目录并发编程01——ThreadLocal并发编程02——ConcurrentHashMap并发编程03——阻塞队列和生产者-消费者模式并发编程04——闭锁Co ... [详细]
  • 本文详细探讨了UML用例图中的两种重要关系——包含关系和扩展关系,通过具体示例解析这两种关系的应用场景及其实现方式。 ... [详细]
  • JobScheduler5.0源码分析
    0.JobScheduler执行代码mJobScheduler(JobScheduler)getSystemService(Context.JOB_SCHEDULER_SERVICE); ... [详细]
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 深入解析ArrayList与LinkedList的差异
    本文详细对比了Java中ArrayList和LinkedList两种常用集合类的特性、性能及适用场景,通过代码示例进行测试,并结合实际应用场景分析其优缺点。 ... [详细]
  • 在寻找轻量级Ruby Web框架的过程中,您可能会遇到Sinatra和Ramaze。两者都以简洁、轻便著称,但它们之间存在一些关键区别。本文将探讨这些差异,并提供详细的分析,帮助您做出最佳选择。 ... [详细]
  • 本文详细解析了2019年西安邀请赛中的一道树形动态规划题目——J题《And And And》。题目要求计算树中所有子路径异或值为0的集合数量,通过深入分析和算法优化,提供了高效的解决方案。 ... [详细]
  • 本文档详细介绍了Robot Framework的基础知识、安装配置方法及其实用技巧。从环境搭建到编写第一个测试用例,涵盖了一系列实用的操作指南和最佳实践。 ... [详细]
  • 本文探讨了命令模式和责任链模式在软件设计中的应用,详细介绍了这两种模式的基本概念、UML图示、主要组成部分及其优缺点。特别关注了命令模式如何通过命令转发实现调用者与接收者之间的解耦,以及责任链模式如何通过顺序传递请求来调整处理逻辑。 ... [详细]
author-avatar
柏拉图恋情
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有