迭代器模式观察者模式

文章目录

    • 1.引出迭代器模式
        • 1.展示院系结构
        • 2.传统方式
    • 2.迭代器模式解决院系结构展示问题
        • 1.基本介绍
        • 2.原理类图
        • 3.类图
        • 4.代码实现
          • 1.Department.java 存储信息的对象
          • 2.College.java 被迭代的类型接口
          • 3.ComputerCollege.java 被迭代的具体实现类,存储数据并将其在创建迭代器的时候传进去
          • 4.ComputerCollegeIterator.java 被实现的具体类的迭代器
          • 5.InfoCollege.java 被迭代的具体类型
          • 6.InfoColleageIterator.java 具体的迭代器
          • 7.OutputImpl.java 统一输出信息的类
          • 8.Client.java 客户端
        • 5.注意事项和细节
    • 3.迭代器模式在ArrayList的应用
  • 观察者模式
    • 1.引出观察者模式
        • 1.天气预报项目需求
        • 2.普通方案
        • 3.普通方案问题分析
    • 2.观察者模式解决天气预报
        • 1.原理分析
        • 2.类图
        • 3.代码实现
          • 1.Observer.java 观察者接口,可以更新自己的信息
          • 2.CurrentConditions.java 具体的观察者
          • 3.Subject.java 信息发布者的接口
          • 4.WeatherData.java 具体的信息发布者,一旦更新信息就会更新观察者的信息
          • 5.Client.java
          • 6.结果
    • 3.观察者模式在JDK的Observable类中的使用

1.引出迭代器模式

1.展示院系结构

image-20240615212257547

2.传统方式

image-20240615212357982

2.迭代器模式解决院系结构展示问题

1.基本介绍

image-20240615212618599

2.原理类图

image-20240615213958769

3.类图

image-20240616200949550

4.代码实现
1.Department.java 存储信息的对象
package com.sun;/*** Description: 系* @Author sun* @Create 2024/6/16 20:11* @Version 1.0*/
public class Department {private String name;private String desc;public Department(String name, String desc) {this.name = name;this.desc = desc;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getDesc() {return desc;}public void setDesc(String desc) {this.desc = desc;}
}
2.College.java 被迭代的类型接口
package com.sun;import java.util.Iterator;/*** Description:* @Author sun* @Create 2024/6/16 20:31* @Version 1.0*/
public interface College {// 获取大学的名字String getName();// 添加一个系void addDepartment(String name, String desc);// 创建迭代器Iterator createIterator();}
3.ComputerCollege.java 被迭代的具体实现类,存储数据并将其在创建迭代器的时候传进去
package com.sun;import java.util.Iterator;/*** Description: 具体的学院* @Author sun* @Create 2024/6/16 20:35* @Version 1.0*/
public class ComputerCollege implements College {// 数组类型的元素Department[] departments;// 保存当前数组的对象个数int numOfDepartment = 0;/*** 初始化数组*/public ComputerCollege() {departments = new Department[3];addDepartment("java", "java");addDepartment("python", "python");addDepartment("go", "go");}/*** 获取当前学院的名字* @return*/@Overridepublic String getName() {return "计算机学院";}/*** 添加要遍历的元素* @param name* @param desc*/@Overridepublic void addDepartment(String name, String desc) {Department department = new Department(name, desc);departments[numOfDepartment++] = department;}/*** 创建迭代器* @return*/@Overridepublic Iterator createIterator() {// 创建一个迭代器并将元素放进去return new ComputerCollegeIterator(departments);}
}
4.ComputerCollegeIterator.java 被实现的具体类的迭代器
package com.sun;import java.util.Iterator;/*** Description:* @Author sun* @Create 2024/6/16 20:13* @Version 1.0*/
public class ComputerCollegeIterator implements Iterator {// 构造器聚合Department,也就是要遍历的元素,这里的是数组的形式Department[] departments;// 遍历的位置int position = 0;public ComputerCollegeIterator(Department[] departments) {this.departments = departments;}/*** 数组的形式判断是否有下一个元素,其实就是判断当前位置有没有元素* @return*/@Overridepublic boolean hasNext() {if(position >= departments.length || departments[position] == null) {return false;}return true;}/*** 数组的形式取出下一个元素,其实就是取出当前元素,然后将下标加一* @return*/@Overridepublic Object next() {Department department = departments[position];position += 1;return department;}/*** 删除的方法默认空实现*/@Overridepublic void remove() {Iterator.super.remove();}
}
5.InfoCollege.java 被迭代的具体类型
package com.sun;import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;/*** Description: 具体的学院* @Author sun* @Create 2024/6/16 20:41* @Version 1.0*/
public class InfoCollege implements College{// 集合类型的元素List<Department> departmentList;/*** 初始化具体的学院信息*/public InfoCollege() {departmentList = new LinkedList<>();addDepartment("信息安全", "信息安全");addDepartment("网络安全", "网络安全");addDepartment("服务器安全", "服务器安全");}/*** 获取名称* @return*/@Overridepublic String getName() {return "信息工程学院";}/*** 集合的方式添加元素* @param name* @param desc*/@Overridepublic void addDepartment(String name, String desc) {Department department = new Department(name, desc);departmentList.add(department);}/*** 创建迭代器* @return*/@Overridepublic Iterator createIterator() {return new InfoColleageIterator(departmentList);}
}
6.InfoColleageIterator.java 具体的迭代器
package com.sun;import java.util.Iterator;
import java.util.List;/*** Description:* @Author sun* @Create 2024/6/16 20:25* @Version 1.0*/
public class InfoColleageIterator implements Iterator {// 集合类型的List<Department> departments;// 未遍历元素的前一个位置int index = -1;public InfoColleageIterator(List<Department> departments) {this.departments = departments;}/*** 集合的方式判断是否有下一个位置* @return*/@Overridepublic boolean hasNext() {if (index >= departments.size() - 1) {return false;}// 如果有下一个位置,直接指向下一个位置index += 1;return true;}/*** 集合的方式获取下一个元素* @return*/@Overridepublic Object next() {return departments.get(index);}/*** 删除方法空实现*/@Overridepublic void remove() {Iterator.super.remove();}
}
7.OutputImpl.java 统一输出信息的类
package com.sun;import java.util.Iterator;
import java.util.List;/*** Description: 输出* @Author sun* @Create 2024/6/16 20:46* @Version 1.0*/
public class OutputImpl {// 构造器聚合学院集合,才能够输出List<College> collegeList;public OutputImpl(List<College> collegeList) {this.collegeList = collegeList;}// 遍历所有学院,然后输出各个学院的系public void printCollege() {// 从学院集合中得到各个学院的迭代器,然后进行遍历for (College college : collegeList) {// 得到学院System.out.println("=====" + college.getName() + "=====");// 得到学院的迭代器Iterator iterator = college.createIterator();// 遍历printDepartment(iterator);}}// 输出学院,输出系public void printDepartment(Iterator iterator) {// 根据得到的迭代器进行遍历while (iterator.hasNext()) {Department next = (Department) iterator.next();System.out.println(next.getName());}}}
8.Client.java 客户端
package com.sun;import java.util.LinkedList;
import java.util.List;/*** Description:* @Author sun* @Create 2024/6/16 20:59* @Version 1.0*/
public class Client {public static void main(String[] args) {// 创建两个学院,放到集合中List<College> collegeList = new LinkedList<>();collegeList.add(new ComputerCollege());collegeList.add(new InfoCollege());// 遍历OutputImpl output = new OutputImpl(collegeList);output.printCollege();}
}
5.注意事项和细节

image-20240617195403899

3.迭代器模式在ArrayList的应用

观察者模式

1.引出观察者模式

1.天气预报项目需求

image-20240617195703024

2.普通方案

image-20240617200144645

image-20240617200256420

3.普通方案问题分析

image-20240617201005774

2.观察者模式解决天气预报

1.原理分析

image-20240617201208773

image-20240617201218388

2.类图

image-20240617204226600

3.代码实现
1.Observer.java 观察者接口,可以更新自己的信息
package com.sun;/*** Description: 观察者接口* @Author sun* @Create 2024/6/17 20:28* @Version 1.0*/
public interface Observer {void update(float temperature, float pressure, float humidity);}
2.CurrentConditions.java 具体的观察者
package com.sun;/*** Description: 具体的观察者* @Author sun* @Create 2024/6/17 20:30* @Version 1.0*/
public class CurrentConditions implements Observer{private float temperature;private float pressure;private float humidity;/*** 更新并显示数据* @param temperature* @param pressure* @param humidity*/@Overridepublic void update(float temperature, float pressure, float humidity) {this.temperature = temperature;this.humidity = humidity;this.pressure = pressure;display();}/*** 显示*/public void display() {System.out.println("Today's temperature: " + temperature);System.out.println("Today's pressure: " + pressure);System.out.println("Today's humidity: " + humidity);}}
3.Subject.java 信息发布者的接口
package com.sun;/*** Description:* @Author sun* @Create 2024/6/17 20:27* @Version 1.0*/
public interface Subject {void registerObserver(Observer o);void removeObserver(Observer o);void notifyObservers();}
4.WeatherData.java 具体的信息发布者,一旦更新信息就会更新观察者的信息
package com.sun;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;/*** Description: 包含最新的天气,和观察者集合,当更新时会依次通知各个观察者* @Author sun* @Create 2024/6/17 20:36* @Version 1.0*/
public class WeatherData implements Subject{/*天气信息*/private float temperature;private float pressure;private float humidity;/*观察者集合*/private List<Observer> observerList;/*** 初始化*/public WeatherData() {observerList = new ArrayList<>();}/*** 设置数据* @param temperature* @param pressure* @param humidity*/public void setData(float temperature, float pressure, float humidity) {this.humidity = humidity;this.pressure = pressure;this.temperature = temperature;changeData();}/*** 当数据改变时会通知所有的观察者*/public void changeData() {notifyObservers();}/*** 注册观察者* @param o*/@Overridepublic void registerObserver(Observer o) {observerList.add(o);}/*** 移除观察者* @param o*/@Overridepublic void removeObserver(Observer o) {observerList.remove(o);}/*** 遍历所有的观察者并通知*/@Overridepublic void notifyObservers() {// 这里使用迭代器遍历(只要能遍历就可以)Iterator<Observer> iterator = observerList.iterator();while (iterator.hasNext()) {Observer next = iterator.next();// 更新next.update(temperature, pressure, humidity);}}}
5.Client.java
package com.sun;/*** Description:* @Author sun* @Create 2024/6/17 21:02* @Version 1.0*/
public class Client {public static void main(String[] args) {// 创建一个有天气数据的对象WeatherData weatherData = new WeatherData();// 创建观察者CurrentConditions currentConditions = new CurrentConditions();// 注册观察者weatherData.registerObserver(currentConditions);// 修改天气状况weatherData.setData(200, 200, 200);// 再修改一下天气状况weatherData.setData(100, 100, 100);}}
6.结果

image-20240618201732219

3.观察者模式在JDK的Observable类中的使用

image-20240618201819188

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/362338.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PAL: Program-aided Language Models

PAL: Program-aided Language Models ArXiv&#xff1a;https://arxiv.org/pdf/2211.10435 GitHub&#xff1a;https://reasonwithpal.com/ 一、动机 大模型与Chain-of-Thought可以很好地将一些复杂的问题分解为若干个子问题并进行逐步推理&#xff1b;但是对于一些较为复杂…

JavaScript算法之龟兔赛跑

简介:龟兔赛跑算法,又称弗洛伊德循环检测算法,是一种在链表中非常常用的算法。它基于运动学和直觉的基本定律。本文旨在向您简要介绍该算法,并帮助您了解这个看似神奇的算法。 假设高速公路上有两辆车。其中一辆的速度为 x,另一辆的速度为 2x。它们唯一能相遇的条件是它们…

个人支付系统实现

基础首页&#xff1a; 订单&#xff1a; 智能售卡系统 基于webmanworkerman开发 禁用函数检查 使用这个脚本检查是否有禁用函数。命令行运行curl -Ss https://www.workerman.net/check | php 如果有提示Function 函数名 may be disabled. Please check disable_functions in …

2024年6月17日~2024年6月26日周报

一、前言 在上周主要完成了可变形卷积的学习的部署。 本周&#xff0c;结合前段时间的工作与闵老师的讨论&#xff0c;思考了接下来的一些尝试方向。本周重新在之前的网络上尝试添加可变形卷积v4&#xff0c;或者将可变形卷积v2修改为可变形卷积v4。另外&#xff0c;继续学习了…

java中的Collections工具类

Collections类是java中提供的一个工具类&#xff0c;它和接口Collection乍一看非常相像&#xff0c;但是二者的区别是非常大的&#xff0c;最明显的就是它们一个是类&#xff0c;而另一个是接口了。Collections工具类的作用是对Set 、Map、 List这些容器提供辅助方法来对容器中…

Springboot + Mybatis-Plus代码生成指南

使用 Spring Boot 和 MyBatis-Plus 生成代码&#xff0c;可以大大简化开发流程&#xff0c;可以保持编码的规范性&#xff0c;生成单元测试等。以下是详细步骤&#xff1a; 配置pom.xml <dependency><groupId>com.baomidou</groupId><artifactId>myb…

4.1 四个子空间的正交性

一、四个子空间的正交性 如果两个向量的点积为零&#xff0c;则两个向量正交&#xff1a; v ⋅ w v T w 0 \boldsymbol v\cdot\boldsymbol w\boldsymbol v^T\boldsymbol w0 v⋅wvTw0。本章着眼于正交子空间、正交基和正交矩阵。两个子空间的中的向量&#xff0c;一组基中的向…

Python期末模拟题库[python123题库]

期末模拟题库 一、单项选择题 1、下列关于Python语言的特点的说法中&#xff0c;错误的是()‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪…

使用ESP32开发一款chat机器人

目的&#xff1a;使用语音对话的方式实现和ai机器人对话&#xff0c;核心硬件如下 主板&#xff1a; ESP32S3 语音&#xff08;拾音器-麦克风&#xff09;&#xff1a;INMP441全向麦克风模块 购买记录&#xff1a; https://oshwhub.com/shukkkk/esp32s3_tft_mp3

原创作品—医疗行业软件界面UI、交互设计

在医疗行业大屏UI设计中&#xff0c;首要的是以用户为中心&#xff0c;深入理解医生、护士、管理层等用户群体的具体需求和工作流程。大屏设计应直观展示关键医疗数据、患者信息、设备状态等&#xff0c;确保用户能够迅速、准确地获取所需信息。同时&#xff0c;功能布局应合理…

【6.26更新】Win11 23H2 22631.3810镜像:免费下载!

微软已发布六月最新的可选更新补丁KB5039302&#xff0c;用户安装后&#xff0c;系统版本将升级至22631.3810。此次更新将会逐步推出一些新功能&#xff0c;在“设置”主页上添加了新的Game Pass推荐卡&#xff0c;同时显示桌面按钮再次默认位于任务栏上。接下来小编给大家带来…

flash申请内存失败,导致老化问题解决

背景 在闪光灯初始化阶段客制化了一个buffer&#xff0c;下发到kernel的闪光灯驱动中用于保存读取闪光灯寄存器的值。功能测试都是正常的&#xff0c;但是一旦开始批量跑产线老化测试会有1/4500左右概率的后主摄拍照卡住。定位根因是闪光灯初始化失败&#xff0c;进一步原因就…

SherlockChain:基于高级AI实现的智能合约安全分析框架

关于SherlockChain SherlockChain是一款功能强大的智能合约安全分析框架&#xff0c;该工具整合了Slither工具&#xff08;一款针对智能合约的安全工具&#xff09;的功能&#xff0c;并引入了高级人工智能模型&#xff0c;旨在辅助广大研究人员针对Solidity、Vyper和Plutus智…

第六十九:iview 表格汇总怎么拿到传过来的数据,而不是自动累加,需要自定义方法

话不多少&#xff0c;先看官方解释 我这个简单&#xff0c;所以所有说明都在图上了 handleSummary({ columns, data }){console.log(columns, data)let sums {}columns.forEach((item,index)>{const key item.key;console.log("key",item)if(index 0){console.…

煤安防爆手机为什么能在煤矿井下使用

煤安防爆手机之所以能在煤矿井下使用&#xff0c;是因为它们经过特殊设计&#xff0c;符合严格的防爆安全标准&#xff0c;能够防止电火花引发爆炸&#xff0c;同时具备防尘防水、抗冲击等特性&#xff0c;确保在恶劣的煤矿环境中稳定可靠地运行&#xff0c;为工作人员提供安全…

【FFmpeg】avformat_open_input函数

【FFmpeg】avformat_open_input函数 1.avformat_open_input1.1 初始化输入格式&#xff08;init_input&#xff09;1.1.1 文件路径判断格式&#xff08;av_probe_input_format2&#xff09;1.1.1.1 格式探测&#xff08;read_probe&#xff09;1.1.1.2 扩展匹配检查&#xff08…

iOS 其他应用的文件如何在分享中使用自己的应用打开

废话少说 一、第一步&#xff1a;先配置好plist文件 右击info.plist如下图文件打开 根据自己需要配置支持的文件类型&#xff0c;也可使用property List中配置&#xff0c;一样的 其他的文件可是参考文档&#xff1a;System-Declared Uniform Type Identifiers 可复制的代码&am…

【前端】[vue3] [uni-app] 组件样式击穿:deep

我是在开发uni-app时测试的思路&#xff0c;大家可以借鉴一下。 我这边测试的是uni组件&#xff0c;但是我觉得即便你用element-plus之类的&#xff0c;样式击穿的思路都相同。 我自定义了一个全局样式scss文件&#xff0c;并引入到了项目中。(如图) 利用vue3 中的 deep 方式…

Java使用poi生成word文档的简单实例

Java使用poi生成word文档的简单实例 生成的效果如下&#xff1a; 用到的poi的简单的知识 新建一个word对象 //新建文件 XWPFDocument document new XWPFDocument();新建段落以及文字样式 //创建段落 XWPFParagraph paragraph document.createParagraph(); paragraph.se…

收银系统源码-开源收银系统-私有化独立部署

千呼新零售2.0-支持OEM私有化独立部署和全开源源码 千呼新零售2.0-支持OEM私有化独立部署和全开源源码 千呼新零售2.0-支持OEM私有化独立部署和全开源源码 千呼新零售2.0-支持OEM私有化独立部署和全开源源码 如需了解请私信交流