迭代器模式观察者模式

news2024/10/5 13:39:56

文章目录

    • 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
     */
    @Override
    public String getName() {
        return "计算机学院";
    }

    /**
     * 添加要遍历的元素
     * @param name
     * @param desc
     */
    @Override
    public void addDepartment(String name, String desc) {
        Department department = new Department(name, desc);
        departments[numOfDepartment++] = department;
    }

    /**
     * 创建迭代器
     * @return
     */
    @Override
    public 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
     */
    @Override
    public boolean hasNext() {
        if(position >= departments.length || departments[position] == null) {
            return false;
        }
        return true;
    }

    /**
     * 数组的形式取出下一个元素,其实就是取出当前元素,然后将下标加一
     * @return
     */
    @Override
    public Object next() {
        Department department = departments[position];
        position += 1;
        return department;
    }

    /**
     * 删除的方法默认空实现
     */
    @Override
    public 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
     */
    @Override
    public String getName() {
        return "信息工程学院";
    }

    /**
     * 集合的方式添加元素
     * @param name
     * @param desc
     */
    @Override
    public void addDepartment(String name, String desc) {
        Department department = new Department(name, desc);
        departmentList.add(department);
    }

    /**
     * 创建迭代器
     * @return
     */
    @Override
    public 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
     */
    @Override
    public boolean hasNext() {
        if (index >= departments.size() - 1) {
            return false;
        }
        // 如果有下一个位置,直接指向下一个位置
        index += 1;
        return true;
    }

    /**
     * 集合的方式获取下一个元素
     * @return
     */
    @Override
    public Object next() {
        return departments.get(index);
    }

    /**
     * 删除方法空实现
     */
    @Override
    public 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
     */
    @Override
    public 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
     */
    @Override
    public void registerObserver(Observer o) {
        observerList.add(o);
    }

    /**
     * 移除观察者
     * @param o
     */
    @Override
    public void removeObserver(Observer o) {
        observerList.remove(o);
    }

    /**
     * 遍历所有的观察者并通知
     */
    @Override
    public 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.coloradmin.cn/o/1839999.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年6月22日(星期六)骑行谷仓坝

2024年6月22日 (星期六) 骑行谷仓坝&#xff0c;早8:00到8:30&#xff0c; 龙泉小学门口(北京路尽头&#xff0c;高架桥下&#xff09;&#xff0c;9:00准时出发 【因迟到者&#xff0c;骑行速度快者&#xff0c;可自行追赶偶遇。】 偶遇地点:集合 &#xff0c;家住东&#xf…

【Ruby基础01】windows和termux中搭建Ruby开发环境

windows下环境搭建 railsinstaller官方git地址 按照文档安装git、nodejs、yarn&#xff0c;安装教程百度一下。railsinstall可以从release页面下载最新版本4.1.0。 安装完成如下 安装RubyMine 下载RubyMine RubyMine下载地址 安装激活 下载文件&#xff0c;按照里面的流程…

【Stable Diffusion 3】本地部署SD3详细教程

&#x1f44b; Hi, I’m Beast Cheng &#x1f440; I’m interested in photography, hiking, landscape… &#x1f331; I’m currently learning python, javascript, kotlin… &#x1f4eb; How to reach me --> 458290771qq.com 1. Stable Diffusion 3 模型下载 「点…

【4003】基于springboot实现的线上阅读系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

emm, ComfyUI的作者从Stability.AI离职了

&#x1f356;背景 今天在更新ComfyUI的过程中&#xff0c;看到Manager中有这样一段描述&#xff1a; 嗯&#xff1f;做了新的官方网站&#xff1f;然后开始新篇章&#xff1f; 难道说ComfyUI的作者从Stability.AI离职了&#xff1f; 赶紧点开链接看了下&#xff0c;emm&…

关于INCA的几个实用功能

01--VUI窗口设计 这个可以按照自己的想法设计INCA观测或标定窗口 首先进入到INCA的环境内&#xff0c;点击实验→加载VUI窗口 选择空的窗口 打开后如下所示&#xff1a; 点击UI开发模式&#xff0c;如下图 如下&#xff1a; 添加标定量、观测量、示波器 窗口的大小需要在开发…

C++之STL(二三)

1、vector源码刨析 1.1、数据结构以及动态扩充算法 其实vector内部有三个指针&#xff0c;分别是数据的第一个元素Myfirst、数据的最后一个元素的下一个位置Mylast&#xff0c;最后一个空间的下一个位置Myend&#xff1b;当你插入数据的时候&#xff0c;先判断当前容量够不够&…

电脑ffmpeg.dll丢失原因解析,找不到ffmpeg.dll的5种解决方法

在数字化时代&#xff0c;多媒体文件的处理已经成为我们日常生活和工作中不可或缺的一部分。在计算机使用过程中&#xff0c;丢失ffmpeg.dll文件是一个特定但常见的问题&#xff0c;尤其是对于那些经常处理视频编解码任务的用户来说。下面小编讲全面分析ffmpeg.dll丢失原因以及…

一文详解扩散模型

文章目录 1、常见的生成模型2、变分推断简介3、文生图的评价指标4、Diffusion Models5、其他技术交流群精选 节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学。 针对算法岗技术趋势、大模型落地…

【计算机网络体系结构】计算机网络体系结构实验-DNS模拟器实验

一、DNS模拟器实验 拓扑图 1. 服务器ip 2. 服务器填写记录 3. 客户端ip以及连接到DNS服务器 4. ping测试

Linux网络命令:网络速度测试工具 speedtest-cli 详解

目录 一、概述 二、安装 speedtest-cli 1、在基于 Debian 的系统上安装 2、在基于 Red Hat 的系统上安装 三、命令语法 1、基本命令语法 2、查看帮助 3、常用选项 四、 speedtest-cli使用示例 1. 基本测试 2. 列出所有可用的服务器 3. 指定服务器进行测试 …

六、资产安全—数据管理(CISSP)

目录 1.学习目标 2.数据管理最佳参考实践 3.数据质量维度:DAMA 4.数据生命周期控制 5.数据净化方式 6.生命周期安全控制 7.EOL、EOS、EOSL 1.学习目标 2.数据管理最佳参考实践 数据策略: 角色与责任: 数据所有权:

Sqlite3数据库基本使用

一、基本概念 数据&#xff1a;能够输入计算机并能被计算机程序识别和处理的信息集合 数据库&#xff1a;长期存储在计算机内、有组织的、可共享的大量数据的集合 DBMS&#xff1a;位于用户与操作系统之间的一层数据管理软件&#xff0c;用于操纵和管理数据库 二、安装 在线…

振动传感器在电机监测中的应用

电机作为现代工业领域中不可或缺的动力源&#xff0c;其运行状态的稳定性和安全性对于整个生产过程的顺利进行至关重要。为了有效监测电机的运行状态&#xff0c;及时发现潜在故障&#xff0c;预防意外停机&#xff0c;振动传感器在其中扮演着举足轻重的角色。 振动传感器是一种…

力扣469A

文章目录 1. 题目链接2. 题目代码3. 题目总结4. 代码分析 1. 题目链接 I Wanna Be the Guy 2. 题目代码 #include<iostream> #include<set> using namespace std; int main(){int highestLevelOfGame;cin >> highestLevelOfGame;set<int> levelCanPas…

【C++入门(4)】引用、内联函数、auto

一、引用与类型转换 我们看下面这个例子。 用 int & 给 double 类型的变量起别名&#xff0c;编译器报错&#xff1a; int main() {double b 3.14;int a b;int& x b;return 0; } 用 const int & 给 double 类型的变量起别名&#xff0c;成功&#xff1a; in…

厂里资讯之app端文章搜索

app端文章搜索 1) 内容介绍 文章搜索 ElasticSearch环境搭建 索引库创建 文章搜索多条件复合查询 索引数据同步 搜索历史记录 Mongodb环境搭建 异步保存搜索历史 查看搜索历史列表 删除搜索历史 联想词查询 联想词的来源 联想词功能实现 2) 搭建ElasticSearch环境 …

A comprehensive review of machine learning-based models for fake news detection

Abstract 互联网在假新闻传播中的作用使其成为一个严重的问题&#xff0c;需要复杂的技术来自动检测。为了应对 Facebook、Twitter、Instagram 和 WhatsApp 等社交媒体网站上误导性材料的快速传播&#xff0c;本研究探索了深度学习方法和各种分类策略领域。该研究特别调查了基…

Spring Bean详解

Spring Bean作用域 默认情况下&#xff0c;所有的 Spring Bean 都是单例的&#xff0c;也就是说在整个 Spring 应用中&#xff0c; Bean 的实例只有一个 如果我们需要创建多个实例的对象&#xff0c;那么应该将 Bean 的 scope 属性定义为 prototype&#xff0c;如果 Spring 需…

【C++11】详谈隐式类型转换

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; C进阶 &#x1f389;其它专栏&#xff1a; C初阶 | Linux | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解 C11中 隐式类型转换 的相关内容。 如果看到最后您觉得这篇文章写得…