研磨设计模式day12迭代器模式

news2024/9/25 21:24:08

目录

场景

解决方案

解决思路

代码示例

代码改造

Java实现迭代器

迭代器模式的优点 

思考 

何时选用


场景

大公司收购了一个小公司,大公司的工资系统采用List来记录工资列表,而小公司是采用数组,老板希望通过决策辅助系统来统一查看工资数据不想看到两份不同的工资表。

解析:如何能够以一个统一的方式 来访问 内部实现不同的 聚合对象

解决方案

迭代器模式

定义:

所谓聚合就是指一组对象的组合结构:比如 Java中的集合、数组等

解决思路

要有一个统一的方式来访问,那就要定义这个统一的访问方式,那么按照统一的访问方式定义出来的接口就应该是Iterator接口。(定义访问和遍历元素的接口)

迭代器迭代的是具体的聚合对象,不同的聚合对象应该有不同的迭代器,所以应该抽象出来一个公共的父类,让它提供 操作聚合对象的 公共接口。也是就Aggregate对象(聚合对象)

如何创建?由于迭代器与聚合对象紧密相关,因此让具体的聚合对象来负责创建相应的迭代器对象

代码示例

工资实体

package day13迭代器模式.entity;

/**
 * 工资实体
 */
public class PayModel {
    /**
     * 支付工资的人员
     */
    private String userName;

    /**
     * 支付的工资数额
     */
    private double pay;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public double getPay() {
        return pay;
    }

    public void setPay(double pay) {
        this.pay = pay;
    }

    @Override
    public String toString() {
        return "PayModel{" +
                "userName='" + userName + '\'' +
                ", pay=" + pay +
                '}';
    }
}

大公司原有的工资管理对象 使用List

package day13迭代器模式;

import day13迭代器模式.entity.PayModel;

import java.util.ArrayList;
import java.util.List;

/**
 * 大公司原有的工资管理对象
 */
public class PayDa {
    /**
     * 聚合对象
     */
    private List list = new ArrayList();

    /**
     * 获取工资列表
     * @return  工资列表
     */
    public List getPayList(){
        return list;
    }

    /**
     * 计算工资
     */
    public void calcPay(){
        // 计算工资并把工资数据填充到工资列表中
        // 为了测试,输入些数据进去
        PayModel payModel = new PayModel();
        payModel.setPay(3800);
        payModel.setUserName("张三");
        PayModel payModel1 = new PayModel();
        payModel1.setPay(5800);
        payModel1.setUserName("李四");
        list.add(payModel);
        list.add(payModel1);
    }
}

小公司原有的工资管理对象 使用数组

package day13迭代器模式;

import day13迭代器模式.entity.PayModel;

import java.util.ArrayList;
import java.util.List;

/**
 * 小公司原有的工资管理对象
 */
public class PayXiao {
    /**
     * 用数组管理
     */
    private PayModel[] pms = null;

    /**
     * 获取工资列表
     * @return  工资列表
     */
    public PayModel[] getPays(){
        return pms;
    }

    /**
     * 计算工资
     */
    public void calcPay(){
        // 计算工资并把工资数据填充到工资列表中
        // 为了测试,输入些数据进去
        PayModel payModel = new PayModel();
        payModel.setPay(3800);
        payModel.setUserName("张三");
        PayModel payModel1 = new PayModel();
        payModel1.setPay(5800);
        payModel1.setUserName("李四");

        pms = new PayModel[2];
        pms[0] = payModel;
        pms[1] = payModel1;
    }
}

Client

package day13迭代器模式;

import day13迭代器模式.entity.PayModel;

import java.util.Collection;
import java.util.Iterator;
import java.util.List;

public class Client {
    public static void main(String[] args) {
        // 访问集团的工资列表
        PayDa payDa = new PayDa();
        // 先计算再获取
        payDa.calcPay();
        List payList = payDa.getPayList();
        Iterator it = payList.iterator();
        System.out.println("大公司工资列表: ");
        while (it.hasNext()){
            PayModel next = (PayModel)it.next();
            System.out.println(next);
        }


        // 访问小公司的工资列表
        PayXiao payXiao = new PayXiao();
        payXiao.calcPay();
        PayModel[] pays = payXiao.getPays();
        System.out.println("小公司工资列表: ");
        
        for (int i = 0; i < pays.length; i++) {
            System.out.println(pays[i]);
        }
    }
}

发现他们的访问方式是完全不一样的(一个是list,一个是对象数组)。

要使用迭代器来整合上面两个聚合对象,那就需要先定义出抽象的聚合对象和迭代器接口来,再提供相应的实现

代码改造

Iterator

package day13迭代器模式;

public interface Iterator {
    /**
     * 移动到聚合对象的第一个位置
     */
    public void first();
    /**
     * 移动到聚合对象的下一个位置
     */
    public void next();

    /**
     * 判断是否移动到聚合对象的最后一个位置
     * @return true表示已经移动到聚合对象的最后一个位置
     *         false表示没有移动到聚合对象的最后一个位置
     */
    public boolean isDone();

    /**
     * 获取迭代的当前元素
     * @return  迭代的当前元素
     */
    public Object currentItem();
}

 定义好统一接口后,就得分别实现,一个是List实现,一个是数组实现

数组实现

package day13迭代器模式.Iterator;

import day13迭代器模式.PayXiao;

/**
 * 用来实现访问数组的迭代接口
 */
public class ArrayIteratorImpl implements Iterator{

    /**
     * 用来存放被迭代的聚合对象
     */
    private PayXiao payXiao = null;

    /**
     * 用来记录当前迭代到的位置索引
     * -1表示刚开始的时候,迭代器指向聚合对象第一个对象之前
     */
    private int index = -1;

    /**
     * 构造函数,传入聚合对象
     */
    public ArrayIteratorImpl(PayXiao payXiao){
        this.payXiao = payXiao;
    }

    @Override
    public void first() {
        index = 0;
    }

    @Override
    public void next() {
        if (index < this.payXiao.size()){
            index = index + 1;
        }
    }

    @Override
    public boolean isDone() {
        if (index == this.payXiao.size()){
            return true;
        }
        return false;
    }

    @Override
    public Object currentItem() {
        return this.payXiao.get(index);
    }
}

集合实现

package day13迭代器模式.Iterator;

import day13迭代器模式.PayDa;

public class CollectionIteratorImpl implements Iterator{
    /**
     * 用来存放被迭代的聚合对象
     */
    private PayDa payDa = null;

    /**
     * 用来记录当前迭代到的位置索引
     * -1表示刚开始的时候,迭代器指向聚合对象第一个对象之前
     */
    private int index = -1;

    /**
     * 构造函数,传入聚合对象
     */
    public CollectionIteratorImpl(PayDa payDa){
        this.payDa = payDa;
    }

    @Override
    public void first() {
        index = 0;
    }

    @Override
    public void next() {
        if (index < this.payDa.size()){
            index = index + 1;
        }
    }

    @Override
    public boolean isDone() {
        if (index == this.payDa.size()){
            return true;
        }
        return false;
    }

    @Override
    public Object currentItem() {
        return this.payDa.get(index);
    }
}

迭代器迭代的是具体的聚合对象,不同的聚合对象应该有不同的迭代器,所以应该抽象出来一个公共的父类,让它提供 操作聚合对象的 公共接口。

也是就Aggregate对象(聚合对象)

package day13迭代器模式;

import day13迭代器模式.Iterator.Iterator;

/**
 * 迭代器迭代的是具体的聚合对象,不同的聚合对象应该有不同的迭代器,
 * 所以应该抽象出来一个公共的父类,让它提供 操作聚合对象的 公共接口。
 * 也是就Aggregate对象(聚合对象)
 */
public abstract class Aggregate {
    /**
     * 工厂方法,创建对应迭代器对象的接口
     */
    public abstract Iterator createIterator();
}

让PayDa和PayXiao,这两个原有的工资管理对象继承这个Aggregate

PayDa

package day13迭代器模式;

import day13迭代器模式.Iterator.CollectionIteratorImpl;
import day13迭代器模式.Iterator.Iterator;
import day13迭代器模式.entity.PayModel;

import java.util.ArrayList;
import java.util.List;

/**
 * 大公司原有的工资管理对象
 */
public class PayDa extends Aggregate{
    /**
     * 聚合对象
     */
    private List list = new ArrayList();

    /**
     * 获取工资列表
     * @return  工资列表
     */
    public List getPayList(){
        return list;
    }

    /**
     * 计算工资
     */
    public void calcPay(){
        // 计算工资并把工资数据填充到工资列表中
        // 为了测试,输入些数据进去
        PayModel payModel = new PayModel();
        payModel.setPay(3800);
        payModel.setUserName("张三");
        PayModel payModel1 = new PayModel();
        payModel1.setPay(5800);
        payModel1.setUserName("李四");
        list.add(payModel);
        list.add(payModel1);
    }

    @Override
    public Iterator createIterator() {
        return new CollectionIteratorImpl(this);
    }
    public Object get(int index){
        Object obj = null;
        if (index < this.list.size()){
            obj = this.list.get(index);
        }
        return obj;
    }

    public int size(){
        return this.list.size();
    }
}

PayXiao

package day13迭代器模式;

import day13迭代器模式.Iterator.ArrayIteratorImpl;
import day13迭代器模式.Iterator.Iterator;
import day13迭代器模式.entity.PayModel;

import java.util.ArrayList;
import java.util.List;

/**
 * 小公司原有的工资管理对象
 */
public class PayXiao extends Aggregate{
    /**
     * 用数组管理
     */
    private PayModel[] pms = null;

    /**
     * 获取工资列表
     * @return  工资列表
     */
    public PayModel[] getPays(){
        return pms;
    }

    /**
     * 计算工资
     */
    public void calcPay(){
        // 计算工资并把工资数据填充到工资列表中
        // 为了测试,输入些数据进去
        PayModel payModel = new PayModel();
        payModel.setPay(3800);
        payModel.setUserName("张三");
        PayModel payModel1 = new PayModel();
        payModel1.setPay(5800);
        payModel1.setUserName("李四");

        pms = new PayModel[2];
        pms[0] = payModel;
        pms[1] = payModel1;
    }

    @Override
    public Iterator createIterator() {
        return new ArrayIteratorImpl(this);
    }

    public Object get(int index){
        Object obj = null;
        if (index < pms.length){
            obj = pms[index];
        }
        return obj;
    }

    public int size(){
        return this.pms.length;
    }
}

Client

package day13迭代器模式;

import day13迭代器模式.entity.PayModel;

import java.util.Collection;
import java.util.Iterator;
import java.util.List;

public class Client {
    public static void main(String[] args) {
        // 访问集团的工资列表
        PayDa payDa = new PayDa();
        // 先计算再获取
        payDa.calcPay();
//        List payList = payDa.getPayList();
//        Iterator it = payList.iterator();
        System.out.println("大公司工资列表: ");
//        while (it.hasNext()){
//            PayModel next = (PayModel)it.next();
//            System.out.println(next);
//        }
        test(payDa.createIterator());


        // 访问小公司的工资列表
        PayXiao payXiao = new PayXiao();
        payXiao.calcPay();
//        PayModel[] pays = payXiao.getPays();
        System.out.println("小公司工资列表: ");
        test(payXiao.createIterator());
    }

    private static void test(day13迭代器模式.Iterator.Iterator it){
        // 循环输出聚合对象中的值
        // 首先设置迭代器到第一个元素
        it.first();
        while (!it.isDone()){
            // 取出当前的元素来
            Object o = it.currentItem();
            System.out.println("当前元素: " + o);
            it.next();
        }
    }
}

迭代器模式的关键思想就是把聚合对象的遍历和访问从聚合对象中分离出来,放入单独的迭代器中。

Java实现迭代器

PayModel类(工资实体)

package day13迭代器Java实现.entity;

/**
 * 工资实体
 */
public class PayModel {
    /**
     * 支付工资的人员
     */
    private String userName;

    /**
     * 支付的工资数额
     */
    private double pay;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public double getPay() {
        return pay;
    }

    public void setPay(double pay) {
        this.pay = pay;
    }

    @Override
    public String toString() {
        return "PayModel{" +
                "userName='" + userName + '\'' +
                ", pay=" + pay +
                '}';
    }
}

创建Aggregate,这里使用java.util.Iterator

package day13迭代器Java实现;

import java.util.Iterator;

/**
 * 迭代器迭代的是具体的聚合对象,不同的聚合对象应该有不同的迭代器,
 * 所以应该抽象出来一个公共的父类,让它提供 操作聚合对象的 公共接口。
 * 也是就Aggregate对象(聚合对象)
 */
public abstract class Aggregate {
    /**
     * 工厂方法,创建对应迭代器对象的接口
     */
    public abstract Iterator createIterator();
}

PayDa继承该抽象类

package day13迭代器Java实现;

import day13迭代器Java实现.entity.PayModel;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 大公司原有的工资管理对象
 */
public class PayDa extends Aggregate {
    /**
     * 聚合对象
     */
    private List<PayModel> list = new ArrayList<PayModel>();

    /**
     * 获取工资列表
     * @return  工资列表
     */
    public List<PayModel> getPayList(){
        return list;
    }

    /**
     * 计算工资
     */
    public void calcPay(){
        // 计算工资并把工资数据填充到工资列表中
        // 为了测试,输入些数据进去
        PayModel payModel = new PayModel();
        payModel.setPay(3800);
        payModel.setUserName("张三");
        PayModel payModel1 = new PayModel();
        payModel1.setPay(5800);
        payModel1.setUserName("李四");
        list.add(payModel);
        list.add(payModel1);
    }

    @Override
    public Iterator createIterator() {
        return list.iterator();
    }

}

PayXiao继承该抽象类

package day13迭代器Java实现;

import day13迭代器Java实现.Iterator.ArrayIteratorImpl;
import day13迭代器Java实现.entity.PayModel;

import java.util.Iterator;

/**
 * 小公司原有的工资管理对象
 */
public class PayXiao extends Aggregate {
    /**
     * 用数组管理
     */
    private PayModel[] pms = null;

    /**
     * 获取工资列表
     * @return  工资列表
     */
    public PayModel[] getPays(){
        return pms;
    }

    /**
     * 计算工资
     */
    public void calcPay(){
        // 计算工资并把工资数据填充到工资列表中
        // 为了测试,输入些数据进去
        PayModel payModel = new PayModel();
        payModel.setPay(3800);
        payModel.setUserName("张三");
        PayModel payModel1 = new PayModel();
        payModel1.setPay(5800);
        payModel1.setUserName("李四");

        pms = new PayModel[2];
        pms[0] = payModel;
        pms[1] = payModel1;
    }

    @Override
    public Iterator createIterator() {
        return new ArrayIteratorImpl(this);
    }

    public Object get(int index){
        Object obj = null;
        if (index < pms.length){
            obj = pms[index];
        }
        return obj;
    }

    public int size(){
        return this.pms.length;
    }
}

将小公司的融入大公司,就让小公司来实现这个迭代器,让它进行统一

ArrayIteratorImpl

package day13迭代器Java实现.Iterator;

import day13迭代器Java实现.PayXiao;

import java.util.Iterator;

/**
 * 用来实现访问数组的迭代接口
 */
public class ArrayIteratorImpl implements Iterator {

    /**
     * 用来存放被迭代的聚合对象
     */
    private PayXiao payXiao = null;

    /**
     * 用来记录当前迭代到的位置索引
     * -1表示刚开始的时候,迭代器指向聚合对象第一个对象之前
     */
    private int index = 0;

    /**
     * 构造函数,传入聚合对象
     */
    public ArrayIteratorImpl(PayXiao payXiao){
        this.payXiao = payXiao;
    }

    @Override
    public void remove() {
        Iterator.super.remove();
    }

    /**
     * 判断是否还有下一个元素
     * @return
     */
    @Override
    public boolean hasNext() {
        if (payXiao != null && index < payXiao.size()){
            return true;
        }
        return false;
    }

    @Override
    public Object next() {
        Object o = null;
        if (hasNext()){
            o = payXiao.get(index);
            // 每取走一个值,就把已访问索引加1
            index++;
        }
        return o;
    }
}

Client

package day13迭代器Java实现;


import day13迭代器Java实现.entity.PayModel;

import java.util.Iterator;

public class Client {
    public static void main(String[] args) {
        // 访问集团的工资列表
        PayDa payDa = new PayDa();
        // 先计算再获取
        payDa.calcPay();
//        List payList = payDa.getPayList();
//        Iterator it = payList.iterator();
        System.out.println("大公司工资列表: ");
//        while (it.hasNext()){
//            PayModel next = (PayModel)it.next();
//            System.out.println(next);
//        }
        test(payDa.createIterator());


        // 访问小公司的工资列表
        PayXiao payXiao = new PayXiao();
        payXiao.calcPay();
//        PayModel[] pays = payXiao.getPays();
        System.out.println("小公司工资列表: ");
        test(payXiao.createIterator());
    }

    private static void test(Iterator it){
        // 判断是否还有下一个元素
        while (it.hasNext()){
            PayModel next = (PayModel)it.next();
            System.out.println(next);
        }
    }
}

 解析:为什么要保留数据的IteratorImpl呢?因为list有iterator方法可以直接调用,数组没有要进行转变,怎么转变呢?就是实现Iterator接口后重写方法next和hasNext这两个方法。以此来跟list相同就可以使用统一的迭代器了。

在Client中,大公司调用自身list的迭代器,小公司调用重写后的迭代器

它new了一个Impl,这个Impl实现的就是java.util.iterator的迭代器且重写了方法 

迭代器模式的优点 

思考 

本质:

控制访问聚合对象中的元素

何时选用

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

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

相关文章

Axure RP

Axure RP 简介下载安装汉化注册 简介 Axure RP&#xff08;Rapid Prototyping&#xff09;是一款交互式原型设计工具&#xff0c;用于创建高保真的交互式界面原型和线框图。它主要用于用户体验&#xff08;UX&#xff09;和用户界面&#xff08;UI&#xff09;设计&#xff0c…

4.RabbitMQ高级特性 幂等 可靠消息 等等

一、如何保证生产者生产消息100%的投递成功 保障消息的成功发出保障MQ节点的成功接收发送端收到MQ节点&#xff08;Broker&#xff09;确认应答完善的消息进行补偿机制 1. 理解Confirm确认消息机制 消息的确认&#xff0c;是指生产者投递消息后&#xff0c;如果Broker收到消…

【C语言进阶(7)】内存函数 —— 使用方法 + 模拟实现

文章目录 前言Ⅰ 内存函数⒈memcpy⒉memmove⒊memcmp⒋memset Ⅱ 模拟实现⒈模拟实现 memcpy⒉模拟实现 memmove⒊模拟实现 memcmp⒋模拟实现 memset 前言 内存操作函数的优势 字符串函数只能操作字符串的内容&#xff0c;局限性很大。而内存函数可以操作任意类型的数据&…

Kali 安装浩劫(Havoc Command and Control Framework)

拉取 github 上的项目到本地进入 Havoc 目录 git clone https://github.com/HavocFramework/Havoc.git cd Havoc下载基于 Kali 的一系列软件 sudo apt install -y git build-essential apt-utils cmake libfontconfig1 libglu1-mesa-dev libgtest-dev libspdlog-dev libboost…

改进YOLO系列:7.添加CA注意力机制

添加CA注意力机制 1. CA注意力机制论文2. CA注意力机制原理3. CA注意力机制的配置3.1common.py配置3.2yolo.py配置3.3yaml文件配置1. CA注意力机制论文 论文题目:Coordinate Attention for Efficient Mobile Network Design 论文链接:Coordinate Attention for Effi…

400电话系统的数据分析和优化对企业的发展和增长有什么具体的好处?

对企业而言&#xff0c;通过400电话系统的数据分析和优化可以带来以下具体好处&#xff0c;促进企业的发展和增长&#xff1a; 优化客户满意度&#xff1a;通过数据分析和优化&#xff0c;企业可以更好地了解客户的需求和偏好&#xff0c;针对性地提供个性化的服务。这将提升客…

如何评估分类模型的好坏

如何评估分类模型的好坏 评估分类预测模型的质量&#xff0c;常用一个矩阵、三条曲线和六个指标。 一个矩阵&#xff1a;混淆矩阵&#xff1b;三条曲线&#xff1a;ROC曲线、PR曲线、KS曲线&#xff1b;六个指标&#xff1a;正确率Acc、查全率R、查准率P、F值、AUC、BEP值、KS…

「快学Docker」Docker容器安全性探析

「快学Docker」Docker容器安全性探析 引言容器安全性威胁Docker容器安全性目录容器镜像安全性主机与容器隔离访问控制运行时监控与防御网络安全性Docker容器安全性最佳实践 总结 引言 在当今快速发展的软件开发和部署领域&#xff0c;容器化技术已经成为一种不可或缺的工具。然…

Zotero文件同步方案:Zotero + Koofr + GooleDrive/OneDrive

Zotero文件同步方案&#xff1a;Zotero Koofr GooleDrive/OneDrive 背景知识ZoteroKoofrGoogleDrive/OneDrive配置步骤注意事项参考资料 觉得文章有收获&#xff0c;欢迎关注公众号鼓励一下作者呀~ 在学习的过程中&#xff0c;也搜集了一些量化、技术的视频及书籍资源&#x…

【业务功能篇83】微服务SpringCloud-ElasticSearch-Kibanan-docke安装-应用层实战

五、ElasticSearch应用 1.ES 的Java API两种方式 Elasticsearch 的API 分为 REST Client API&#xff08;http请求形式&#xff09;以及 transportClient API两种。相比来说transportClient API效率更高&#xff0c;transportClient 是通过Elasticsearch内部RPC的形式进行请求…

Win11安装VMware中的镜像的下载

首先&#xff0c;下载好VMware之后需要许可证&#xff0c;在VMware选择许可证填上即可&#xff08;可以解决一部分VMware创建虚拟机过程中出现的问题&#xff09;。 百度网盘自取&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/17gBySqoPi2HeGJJlalp-VQ 提取码&…

学信息系统项目管理师第4版系列01_导读

2023年对于信息系统项目管理师&#xff08;以下简称“高项”&#xff09;的考生来说真是命运多舛的一年&#xff0c;上半年改大纲换教材&#xff0c;下半年改机考换考法&#xff0c;真是一言难尽啊。 不过&#xff0c;“天要下雨&#xff0c;娘要嫁人”&#xff0c;该考试拿证…

Linux:Nginx服务与搭建

目录 一、Nginx概述 二、Nginx三大作用&#xff1a;反向代理、负载均衡、动静分离 三、Nginx和Apache 3.1Nginx和Apache的差异 3.2Nginx和Apache的优缺点比较 四、编译安装niginx 五、创建Nginx 自启动文件 六、Nginx的信号使用 6.1信号 七、升级 nginx1.18 nginx1.2…

java 里面 long 转换int内存分析

了解补码知识点 要将补码转换为十进制&#xff0c;需要确定补码的符号位。如果补码的符号位为1&#xff0c;则表示为负数&#xff0c;否则表示为正数。 假设我们有一个补码为1 0110 1011 1100 1101 1000 0011 1101 1100 0010 1101 1111 1101 1100 0001 1100 0011 0100 首先&a…

无涯教程-进程 - 组会话控制

在本章中&#xff0c;我们将熟悉进程组&#xff0c;会话和作业控制。 进程组(Process Groups ) - 进程组是一个或多个进程的集合&#xff0c;一个进程组由一个或多个共享相同进程组标识符(PGID)的进程组成。 会话(Sessions) - 它是各种进程组的集合。…

软考A计划-系统集成项目管理工程师-项目风险管理-下

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

开源哲学:自由、共享与合作

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Spark最后一课

1.Spark的提交过程(YarnCluster) 1.命令输入脚本启动,启动submit任务 2.解析参数 看是cluster还是yarn单点模式 3.创建客户端YarnClusterApplication 4.封装提交命令交给RM 5.RM在NM上启动ApplicationMaster(AM) 注意AM消耗的资源都是container的 6.AM根据参数启动Driver并且…

使用Burp Suite进行Web应用渗透测试

使用Burp Suite进行Web应用渗透测试是一种常见的方法&#xff0c;可以帮助发现Web应用程序中的安全漏洞和弱点。 步骤&#xff1a; 准备工作&#xff1a; 首先&#xff0c;确保已经安装了Burp Suite&#xff0c;并配置浏览器以使用Burp Suite作为代理。 配置代理&#xff1a;…

Nvidia Jetson 编解码开发(7)Jetpack 4.x版本Multimedia API 硬件编码开发--输出端对接ROS publish

1.前言 Nvidia Jetson 编解码开发(6)Jetpack 4.x版本Multimedia API 硬件编码开发--输入端对接Camera V4L2采集_free-xx的博客-CSDN博客 基于上篇基于开发 需求: (1)2路Camera采集 + H265编码 (2)2路编码完的H265数据通过ROS 发布出去,上位机播放 2. 开发记录 2…