迭代器模式观察者模式

文章目录

    • 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

契约锁电子签章平台 add 远程命令执行漏洞复现(XVE-2023-23720)

0x01 产品简介 契约锁电子签章平台是上海亘岩网络科技有限公司推出的一套数字签章解决方案。契约锁为中大型组织提供“数字身份、电子签章、印章管控以及数据存证服务”于一体的数字可信基础解决方案,可无缝集成各类系统,让其具有电子化签署的能力,实现组织全程数字化办公。通…

【LeetCode刷题】面试题 17.19. 消失的两个数字

1. 题目链接2. 题目描述3. 解题方法4. 代码 1. 题目链接 面试题 17.19. 消失的两个数字 2. 题目描述 3. 解题方法 例子假设&#xff1a; 数组A元素为 &#xff1a;1 &#xff0c;4&#xff0c;5 缺少的元素为&#xff1a;2&#xff0c; 3 那么所有整数就为1 ~ 5&#xff…

什么是无限铸币攻击?它是如何运作的?

一、无限铸币攻击解释 无限铸币攻击是指攻击者操纵合约代码不断铸造超出授权供应限制的新代币。 这种黑客行为在去中心化金融 (DeFi) 协议中最为常见。这种攻击通过创建无限数量的代币来损害加密货币或代币的完整性和价值。 例如&#xff0c;一名黑客利用了 Paid 网络的智能…

shadertoy-安装和使用

一、安装vscode 安装vscode流程 二、安装插件 1.安装glsl编辑插件 2.安装shader toy插件 三、创建glsl文件 test.glsl文件 float Grid(float size, vec2 fragCoord) {vec2 r fragCoord / size;vec2 grid abs(fract(r - 0.5) - 0.5) / fwidth(r);float line min(grid…

网络安全从入门到精通(特别篇I):应急响应案例

蓝队应急响应实战 1. 应急响应1. 应急响应 获取当前WEB环境的组成架构(语言,数据库,中间件,系统等) 分析思路: 1、利用时间节点筛选日志行为 2、利用已知对漏洞进行特征筛选 3、利用后门查杀进行筛选日志行为 #内容点: 应急响应: 1、抗拒绝服务攻击防范应对指南 2、勒…

【云原生】Kubernetes----证书过期处理办法

目录 引言 一、证书过期的问题与影响 二、解决方案 &#xff08;一&#xff09;查看证书剩余时间 &#xff08;二&#xff09;备份重要数据 &#xff08;三&#xff09;更新证书 &#xff08;四&#xff09;重启相关组件的pod 引言 随着云计算技术的飞速发展&#xff0…

IPFoxy代理IP:IPv4与IPv6性能与安全性对比

在使用IPFoxy静态代理IP的过程中&#xff0c;经常有小白朋友疑惑&#xff0c;IPv4与IPv6有何区别&#xff1f;他们在性能与安全上的差别如何&#xff0c;又该如何选择&#xff1f;在这篇博文中&#xff0c;我们将从各个方面为您科普这一区别&#xff0c;帮助您更好的选择。 一、…

[Linux] vi编辑器

命令模式&文本模式 命令模式就输入命令然后执行&#xff0c;文本模式就是系统把你的输入都当成写进文件里的字符 切换模式&#xff1a; 刚进入默认是命令模式&#xff0c;按: i I a A o O 进入文本模式&#xff0c; 通过他们进入文本模式有什么不同&#xff1f; 然后按esc进…

一个新的剪辑拼接图片和视频类APP在测试阶段需要测试内容,以iPhone APP为例:

1.UI参照原型图和设计稿 如有改动&#xff0c;需及时沟通 2.iPad转屏、不同iPhone和iPad机型测试 3.黑夜白天模式 2.各功能模块流程需要测试跑通 3.订阅支付模块 a. UI设计是否和设计稿一致 b.涉及订阅的位置都要测试 c.免费试用是否显示&#xff1b;试用结束后&#xff0c…

【论文阅读】-- MIRIA:用于时空交互数据原位可视化和分析的混合现实工具包

MIRIA: A Mixed Reality Toolkit for the In-Situ Visualization and Analysis of Spatio-Temporal Interaction Data 摘要1 引言2 背景及相关工作2.1 用户交互和运动数据分析2.2 沉浸式分析 3 时空用户交互分析3.1 现有系统的用例和分析3.2 要求 4 MIRIA 工具包4.1 一般概念4.…

人工智能—美国加利福尼亚州房价预测实战

引言 在当今快速发展的房地产市场中&#xff0c;房价预测已成为一个至关重要的领域。它不仅关系到投资者的决策&#xff0c;也直接影响到普通购房者的生活质量。特别是在美国加利福尼亚州&#xff0c;这个以其高房价和房地产市场的波动性而闻名的地方&#xff0c;准确的房价预…

React@16.x(34)动画(中)

目录 3&#xff0c;SwitchTransition3.1&#xff0c;原理3.1.2&#xff0c;key3.1.2&#xff0c;mode 3.2&#xff0c;举例3.3&#xff0c;结合 animate.css 4&#xff0c;TransitionGroup4.1&#xff0c;其他属性4.1.2&#xff0c;appear4.1.2&#xff0c;component4.1.3&…

JWT整合Gateway实现鉴权(RSA与公私密钥工具类)

一.业务流程 1.使用RSA生成公钥和私钥。私钥保存在授权中心&#xff0c;公钥保存在网关(gateway)和各个信任微服务中。 2.用户请求登录。 3.授权中心进行校验&#xff0c;通过后使用私钥对JWT进行签名加密。并将JWT返回给用户 4.用户携带JWT访问 5.gateway直接通过公钥解密JWT进…

深圳中小企业融资攻略,贷款方法大盘点!

中小企业融资这事&#xff0c;可不是一个简单的事情。资金对中小企业来说&#xff0c;就像血液对人体一样重要。企业发展离不开资金支持&#xff0c;特别是在今年这个环境下&#xff0c;政策对中小企业还挺友好的。今天讲解一下中小微企业常用的几种贷款方法。希望能让大家更明…

MySQL之复制(五)

复制 复制的原理 复制文件 3.master.info 这个文件用于保存备库连接到主库所需要的信息&#xff0c;格式为纯文本(每行一个值)&#xff0c;不同的MySQL版本&#xff0c;其记录的信息也可能不同。此文件不能删除&#xff0c;否则备库在重启后无法连接到主库。这个文件以文本的…

Java面试八股之myBatis中#{}和${}标识的区别是什么

myBatis中#{}和${}标识的区别是什么 MyBatis中的#{}和${}都是用来动态地向SQL语句中插入参数的&#xff0c;但它们之间存在几个关键的区别&#xff1a; 预编译与字符串替换&#xff1a; #{}是预编译处理的参数占位符。MyBatis会将#{}中的内容替换为一个预编译语句的参数标记…

[Linux] 其他命令

cat cat是用法极多的一个命令&#xff1a; 1.输入输出 如果不加任何修饰&#xff0c;只一个cat&#xff0c;它是&#xff1a; 标准输入设备&#xff08;键盘&#xff09;——》标准输出设备&#xff08;显示器&#xff09; 显示文件内容&#xff1a; cat filename 输入重定向&a…

在金仓数据库中导入sql文件,解决中文数据乱码问题

先确定数据库服务端编码方式是UTF8&#xff0c;如果不是&#xff0c;那就先解决这个问题。操作&#xff1a;当连接数据库之后&#xff0c;执行show server_encoding 用Notepad打开&#xff0c;目的&#xff1a;确定文件编码是UTF-8格式 在sql文件前面加上set NAMES utf8; …

为什么要进行数据库设计?

本文介绍数据库设计的定义、知识要求和设计的内容。 01、数据库设计的定义和知识要求 数据库设计是指对于一个给定的应用环境,根据用户的需求,在某一具体的数据库管理系统上,构造一个性能良好的数据模式,建立数据库及其应用系统,使之能够有效地存储数据,满足各种用户的信…

【宠粉赠书】科技图表绘制:R语言数据可视化

为了回馈粉丝们的厚爱&#xff0c;今天小智给大家送上一套科研绘图的必备书籍——《R语言数据可视化&#xff1a;科技图表绘制》。下面我会详细给大家介绍这套图书&#xff0c;文末留有领取方式。 图书介绍 《R语言数据可视化&#xff1a;科技图表绘制》结合编者多年的数据分析…