研磨设计模式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;}@Overridepublic 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;}@Overridepublic void first() {index = 0;}@Overridepublic void next() {if (index < this.payXiao.size()){index = index + 1;}}@Overridepublic boolean isDone() {if (index == this.payXiao.size()){return true;}return false;}@Overridepublic 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;}@Overridepublic void first() {index = 0;}@Overridepublic void next() {if (index < this.payDa.size()){index = index + 1;}}@Overridepublic boolean isDone() {if (index == this.payDa.size()){return true;}return false;}@Overridepublic 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);}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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);}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic void remove() {Iterator.super.remove();}/*** 判断是否还有下一个元素* @return*/@Overridepublic boolean hasNext() {if (payXiao != null && index < payXiao.size()){return true;}return false;}@Overridepublic Object next() {Object o = null;if (hasNext()){o = payXiao.get(index);// 每取走一个值,就把已访问索引加1index++;}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的迭代器且重写了方法
迭代器模式的优点
思考
本质:
控制访问聚合对象中的元素
何时选用
相关文章:

研磨设计模式day12迭代器模式
目录 场景 解决方案 解决思路 代码示例 代码改造 Java实现迭代器 迭代器模式的优点 思考 何时选用 场景 大公司收购了一个小公司,大公司的工资系统采用List来记录工资列表,而小公司是采用数组,老板希望通过决策辅助系统来统一查看…...
Python3不支持sqlite3的解决方法
先贴报错: >>> import sqlite3 Traceback (most recent call last):File "<stdin>", line 1, in <module>File "/usr/local/lib/python3.10/sqlite3/__init__.py", line 57, in <module>from sqlite3.dbapi2 impor…...

Qt应用开发(基础篇)——消息对话框 QMessageBox
一、前言 QMessageBox类继承于QDialog,是一个模式对话框,常用于通知用户或向用户提出问题并接收答案。 对话框QDialog QMessageBox消息框主要由四部分组成,一个主要文本text,用于提醒用户注意某种情况;一个信息文本informativeTex…...

ETC reset
ETC重新激活 换前挡风玻璃膜会把ETC设备拿下来,需要到【ETC服务中心】重新【粘上去】,另外需要工作人员用手持终端【重新激活】 ETC 背面有个 【白色】开关小柱子,一旦拆下来就失效,因为这个开关弹出来了 截面图看就是这样的&…...

2023年8月30日-[SWPUCTF 2021 新生赛]jicao
<?php highlight_file(index.php); include("flag.php"); $id$_POST[id]; $jsonjson_decode($_GET[json],true); if ($id"wllmNB"&&$json[x]"wllm") {echo $flag;} ?> 包含了flag.php文件,设定了一个POST请求的id和…...

MariaDB数据库服务器
目录 一、什么是数据库? 二、什么是关系型数据库? 三、数据库字符集和排序规则是什么? 四、常用数据类型 五、Mariadb数据库相关配置案例 一、什么是数据库? 数据库(DB)是以一定方式长期存储在计算机硬盘内…...

Nat. Mach. Intell 2023 | DrugBAN+:域自适应的可解释双线性插值网络改进药物-靶标预测(DTI)
DrugBAN:Interpretable bilinear attention network with domain adaptation improves drug–target prediction 论文:Interpretable bilinear attention network with domain adaptation improves drug–target prediction | Nature Machine Intellige…...
org.springframework.web.reactive.function.server.ServerResponse设置响应头
记录一下 String host serverRequest.uri().getHost();Consumer<HttpHeaders> headersConsumer consumer -> {consumer.setAccessControlAllowOrigin(host);consumer.setAccessControlAllowCredentials(true);consumer.set("Access-Control-Allow-Headers"…...

高频面试题:如何分别用三种姿势实现三个线程交替打印0到100
最近面试遇到的一道题,需要三个线程交替打印0-100,当时对多线程并不是很熟悉因此没怎么写出来,网上搜了之后得到现 synchronized wait/notifyAll 实现思路:判断当前打印数字和线程数的取余,不等于当前线程则处于等待…...

【git】Idea撤回本地分支、或远程分支提交记录的各种实际场景操作步骤
文章目录 idea撤回本地分支、远程分支场景操作集合场景1:要撤回最后一次本地分支的提交实现效果:操作步骤: 场景2:要撤回最后一次远程分支的提交有撤销记录的:实现效果:操作步骤: 无撤销记录的&…...
FPGA SPI 驱动程序
1.引言 此驱动程序已经完成很久了,花了2个星期的时间,主要是提升程序运行的效率。最近整理文件的时候又看到了,记录一下。 2.程序框架分解 module adc7254_Ctrl(input sys_clk, //system clkc 50Minput re…...
【实战】十一、看板页面及任务组页面开发(五) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(二十七)
文章目录 一、项目起航:项目初始化与配置二、React 与 Hook 应用:实现项目列表三、TS 应用:JS神助攻 - 强类型四、JWT、用户认证与异步请求五、CSS 其实很简单 - 用 CSS-in-JS 添加样式六、用户体验优化 - 加载中和错误状态处理七、Hook&…...
mac m1 docker 安装kafka和zookeeper
获取本地ip地址 ifconfig en0 192.168.0.105. 下面的ip都会使用到 1、拉取镜像 docker pull wurstmeister/zookeeper docker pull wurstmeister/kafka 2、启动容器 启动 zookeeper docker run -d --name zookeeper -p 2181:2181 映射 3、 启动 kafka 注意ÿ…...

宏观经济和风电预测误差分析(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
GO学习之 搜索引擎(ElasticSearch)
GO系列 1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 8、GO学习之 函数(Function) 9、GO学习之 接口(Interface) 10、GO学习之 网络通信(Net/Htt…...
Sentinel —实时监控
Sentinel 提供对所有资源的实时监控。如果需要实时监控,客户端需引入以下依赖(以 Maven 为例): <dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-transport-simple-http</artif…...

接口优化通用方案
目录 批量异步、回调缓存预取池化并行锁粒度索引大事务海量数据 批量 批量思想:批量操作数据库 优化前: //for循环单笔入库 for(TransDetail detail:transDetailList){ insert(detail); } 优化后: batchInsert(transDetailList); 异步、回…...
用Visual Studio 2022的.map文件来查看C++变量在内存中的布局情况
先看几个实例 代码1 #include <iostream> int data_arr[32768]; int main() {data_arr[1] 11;std::cout<<"data_arr[1]: " << data_arr[1] << std::endl;return data_arr[1]; } 上述代码在Win10 X64,MSVC Release模式下编译&…...

使用代理突破浏览器IP限制
一、实验目的: 主要时了解代理服务器的概念,同时如何突破浏览器IP限制 二、预备知识: 代理服务器英文全称是Proxy Server,其功能就是代理网络用户去取得网络信息。形象的说:它是网络信息的中转站,特别是它具有一个cac…...

HuggingFace中的 Files and versions 如何优雅下载到本地?(Python requests,tqdm)
前言 在使用huggingface把玩各种大模型时,如果选择从远程加载模型,这个过程可能因为网络问题而非常耗时甚至直接失败,所以把模型、分词器等相关文件下载到本地,再直接从本地加载就成了不可回避的流程。 在进入具体版本的模型后&…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG
TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码:HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...