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

目录

场景

解决方案

解决思路

代码示例

代码改造

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的迭代器且重写了方法 

迭代器模式的优点 

思考 

本质:

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

何时选用

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

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

相关文章

Spring事务的隔离级别

使用事务隔离级别可以控制并发事务在同时执行时的某种行为。 前言&#xff1a; 在学习Spring事务隔离级别前我们先了解一下什么是脏读&#xff0c;幻读&#xff0c;不可重复读。 脏读&#xff1a; 一个事务读到另一个事务未提交的更新数据&#xff0c;所谓脏读&#xff0c;就…

软件测试用例经典方法 | 逻辑覆盖测试法及案例【文末赠书】

逻辑覆盖测试法是常用的一类白盒测试方法&#xff0c;其以程序内部逻辑结构为基础&#xff0c;通过对程序逻辑结构的遍历来实现程序测试的覆盖。逻辑覆盖测试法要求测试人员对程序的逻辑结构有清晰的了解。 逻辑覆盖测试法是一系列测试过程的总称&#xff0c;是使测试过程逐渐…

如何使用CSS实现一个平滑滚动到页面顶部的效果(回到顶部按钮)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 平滑滚动到页面顶部的效果&#xff08;回到顶部按钮&#xff09;⭐ 创建HTML结构⭐ 编写CSS样式⭐ 编写JavaScript函数⭐ 添加滚动事件监听器⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右…

Linux环境搭建SVN服务器并实现公网访问 - cpolar端口映射

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

智慧燃气解决方案[49页PPT]

导读&#xff1a;原文《智慧燃气解决方案[49页PPT]》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 部分内容&#xff1a; 喜欢文章&#xff0c;您可以关注评论转发…

php 多维数组排序,根据某一列排序(array_multisort()和array_column()联用)

array_multisort()和array_column()联用效果直接叠满,11>100 先来看下两个函数的介绍和用法 array_column(): 一般模式,不需要其中字段作为id,只需要提取val值 <?php // 可能从数据库中返回数组 $a [[id > 5698, first_name > Peter, last_name > G…

手把手教你搭建Serv-U FTP服务器共享文件并实现外网远程访问「无公网IP」

文章目录 1. 前言2. 本地FTP搭建2.1 Serv-U下载和安装2.2 Serv-U共享网页测试2.3 Cpolar下载和安装 3. 本地FTP发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 科技日益发展的今天&#xff0c;移动电子设备似乎成了我们生活的主角&#xff0c;智能…

YUV数据图形化理解

以下为音视频基础数据的图像化展示&#xff0c;方便大家理解 RGB24 RGB交替排列&#xff0c;RGBRGBRGB 占用空间Width*Height*3 YUV420P YU12(I420) 每4个Y分量&#xff0c;共一个UV分量 Y是连续的&#xff0c;U也是连续的&#xff0c;V也是连续的 占用空间 Width*Height …

68、使用aws官方的demo和配置aws服务,进行视频流上传播放

基本思想:参考官方视频,进行了配置aws,测试了视频推流,rtsp和mp4格式的视频貌似有问题,待调研和解决 第一步:1) 进入aws的网站,然后进入ioT Core 2)先配置 Thing types & Thing,选择香港的节点,然后AWS ioT--->Manage---> Thing type 然后输入名字,创建Th…

python下载bilibili视频,下载合集,下载选集

一. 内容简介 bilibili视频下载&#xff0c;下载合集&#xff0c;下载选集 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3代码 链接&#xff1a;https://pan.baidu.com/s/1tO8xSmaqqoTxHI9P_UkDBw?pwd1234 提取码&#xff1a;1234 三.主要流程 3.1 …

浅谈大数据智能审计如何助力审计工作

随着互联网大数据的持续发展&#xff0c;大数据审计近年来面对着相等的机遇和挑战。那么&#xff0c;如果利用大数据等相关技术对审计工作作出突出贡献&#xff0c;单位和企业又该从何入手做好大数据审计工作应用&#xff0c;这些都成为每位审计人员将要面临的重要问题。 1. 政…

【MySQL系列】Select语句单表查询详解入门(SELECT,AS,模糊查询,运算符,逻辑运算符)

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

Unity——音乐、音效

在游戏运行的过程中&#xff0c;音效的播放时机与游戏当前内容密切相关&#xff0c;而且随着场景的变化、剧情的推进&#xff0c;背景音乐也需要适时切换&#xff0c;所以恰当地控制音乐和音效的播放非常重要。音乐和音效的播放、停止、切换和音量变化等&#xff0c;都需要由脚…

【Apollo】阿波罗自动驾驶系统:驶向未来的智能出行(含源码安装)

前言 Apollo (阿波罗)是一个开放的、完整的、安全的平台&#xff0c;将帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统&#xff0c;快速搭建一套属于自己的自动驾驶系统。 开放能力、共享资源、加速创新、持续共赢是 Apollo 开放平台的口号。百度把自己所拥有的强大、…

异地访问Oracle数据库的解决方案:利用内网穿透实现PL/SQL远程连接的建议与步骤

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle ​ 小月糖糖主页 在强者的眼中&#xff0c;没有最…

uniapp 实现地图距离计算

在uniapp中实现地图距离计算可以借助第三方地图服务API来实现。以下是一种基本的实现方式&#xff1a; 注册地图服务API账号&#xff1a;你可以选择使用高德地图、百度地图等提供地图服务的厂商&#xff0c;注册一个开发者账号并获取API密钥。 安装相关插件或SDK&#xff1a;根…

VR智慧校园资中控管理平台综合提升了课堂教学质量

随着越来越多高校在课堂中引进VR虚拟仿真实训系统&#xff0c;为了方便老师对全班同学进行高效率地管理&#xff0c;VR中控平台应运而生。下面为您详细介绍VR中控平台在课堂教学中的应用优势。 VR中控系统安装在教师总控端&#xff0c;融合了课件、视频、3D动画等丰富的教学资源…

VScode中写Verilog时,iverilog语法自动纠错功能不起作用

VScode中编写Verilog时&#xff0c;iverilog语法自动纠错功能不起作用 问题&#xff1a;按照教程搭建vscode下Verilog编译环境&#xff0c;发现语法纠错功能一直无效&#xff0c;检查了扩展Verilog-HDL/SystemVerilog/Bluespec SystemVerilog的配置也没有任何问题。 错误原因&a…

软考:中级软件设计师:HTML

软考&#xff1a;中级软件设计师:HTML 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备的 &#xff…

提升Java开发效率:掌握HashMap的常见方法与基本原理

文章目录 前言一、概述1. 认识HashMap2. HashMap 的作用和重要性3. 简要讲解 HashMap 的基本原理和实现方式 二、了解 HashMap 创建及其的常见操作方法1. HashMap的创建2. 添加元素 put()3. 访问元素 get()4. 删除元素 remove()5. 计算大小 size()6. 迭代 HashMap for-each7.判…