研磨设计模式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把玩各种大模型时,如果选择从远程加载模型,这个过程可能因为网络问题而非常耗时甚至直接失败,所以把模型、分词器等相关文件下载到本地,再直接从本地加载就成了不可回避的流程。 在进入具体版本的模型后&…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
