当前位置: 首页 > news >正文

web网站开发能使用c语言吗/企业网站建设公司

web网站开发能使用c语言吗,企业网站建设公司,辽宁省建设注册中心网站,宁波附近的seo推广备忘录模式和迭代器模式备忘录模式代码示例迭代器模式代码示例使用迭代器遍历集合的同时不能删除/增加元素总结备忘录模式 备忘录模式,也叫快照(Snapshot)模式。 在 GoF的《设计模式》⼀书中,备忘录模式是这么定义的:…

备忘录模式和迭代器模式

  • 备忘录模式
    • 代码示例
  • 迭代器模式
    • 代码示例
    • 使用迭代器遍历集合的同时不能删除/增加元素
    • 总结

备忘录模式

备忘录模式,也叫快照(Snapshot)模式。
在 GoF的《设计模式》⼀书中,备忘录模式是这么定义的:

Captures and externalizes an object’s internal state so that it can be restored later, all without violating encapsulation.

在不违背封装原则的前提下,捕获⼀个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态,属于行为型模式。

备忘录模式主要分为三个角色 :
发起人角色(Originator): 它是一个需要保存状态的类,可以创建一个备忘录/备份,并存储它的当前内部状态,也可以使用备忘录来恢复其内部状态。

**备忘录角色 Memento:**存储原发器的内部状态。除了发起人,备忘录类不能被其他类创建和修改。一般通过将Memento类与Originator类定义在同一个包中来实现封装(也可以作为内部类),使用默认访问标识符来定义Memento类,即保证其包内可见。

**负责人角色 Caretaker:**负责人又称为管理者,它负责保存备忘录。在负责人类中可以存储一个或多个备忘录对象,它只负责存储备忘录对象,而不能修改备忘录对象(负责人类只提供备忘录对象的读写接口,不提供备忘录属性的读写接口)。

代码示例

以一个文本编辑器为例,用户可以不断输入文本内容,也可以撤销上次输入的内容,按照备忘录模式实现如下:

public class InputText {private StringBuilder text = new StringBuilder();public void input(String input) {text.append(input);}public String show() {return text.toString();}public Snapshot createSnapshot() {return new Snapshot(this.text.toString());}public void restoreSnapshot(Snapshot snapshot) {text.replace(0, this.text.length(), snapshot.getText());}}
public class Snapshot {private String text;public Snapshot(String text) {this.text = text;}public String getText() {return text;}
}
public class SnapshotHolder {private Stack<Snapshot> stack = new Stack<>();public Snapshot getSnapshot() {return stack.pop();}public void pushSnapshot(Snapshot snapshot) {stack.push(snapshot);}
}
public class Test {public static void main(String[] args) {SnapshotHolder snapshotHolder = new SnapshotHolder();InputText text = new InputText();text.input("你好");System.out.println(text.show());snapshotHolder.pushSnapshot(text.createSnapshot());text.input("我是Xiaoming");System.out.println(text.show());System.out.println("=============回撤==========");text.restoreSnapshot(snapshotHolder.getSnapshot());System.out.println(text.show());}}

在这里插入图片描述

对于⼤对象的备份来说,备份占⽤的存储空间会⽐较⼤,备份和恢复的耗时会⽐较⻓。针对这个问题,不同的业务场景有不同的处理⽅式。⽐如,只备份必要的恢复信息,结合最新的数据来恢复;
再⽐如,全量备份和增量备份相结合,低频全量备份,⾼频增量备份,两者结合来做恢复。

迭代器模式

迭代器模式(Iterator Design Pattern),也叫作游标模式(Cursor Design Pattern),它提供一种顺序访问容器或者集合对象元素的方法,而又无需暴露集合内部表示。属于行为型模式

迭代器模式,一般包含四个角色
抽象容器 : 提供创建迭代器的接口
具体容器 : 创建具体迭代器
抽象迭代器 : 定义遍历元素的接口
具体迭代器 : 实现元素遍历行为

一般来说我们会在容器中定义
iterator() ⽅法,⽤来创建迭代器。迭代器接⼝中需要定义 hasNext()、next() 两个最基本的⽅法用于遍历。

代码示例

public interface Iterator<T> {public boolean hasNext();T next();
}
public class ListIterator implements Iterator<String>{private List<String> queue;private int cursor = 0;public ListIterator(List<String> queue) {this.queue = queue;}@Overridepublic boolean hasNext() {return cursor != queue.size();}@Overridepublic String next() {String name = queue.get(cursor);cursor++;return name;}
}
public interface Queue {void add(String name);void remove(String name);Iterator iterator();}
public class QueueImpl implements Queue{private List<String> list = new ArrayList<>();@Overridepublic void add(String name) {list.add(name);}@Overridepublic void remove(String name) {list.remove(name);}@Overridepublic Iterator iterator() {return new ListIterator(list);}
}
public class Test {public static void main(String[] args) {QueueImpl queue = new QueueImpl();queue.add("小明");queue.add("小花");queue.add("王一");Iterator<String> iterator = queue.iterator();while (iterator.hasNext()) {String name = iterator.next();System.out.println(name);}}
}

使用迭代器遍历集合的同时不能删除/增加元素

在通过迭代器来遍历集合元素的同时,增加或者删除集合中的元素,有可能会导致某个元素被重复遍历或遍历不到。(这是因为为了保持数组存储数据的连续性,数组的删除/插入操作会涉及元素的搬移)

针对这种问题有两种解决⽅案:⼀种是遍历的时候不允许增删元素,另⼀种是增删元素之后让遍历报错。

第一种实现比较困难,我们可以方便的知道遍历开始的时间点,但是我们无法知晓遍历什么时候结束(它可能获取到某个满足条件的值之后就结束遍历了),而通过新方法告知集合遍历结束也比较容易遗漏。
Java采用的是第二种方法: 增删元素之后让遍历报错

Java在ArrayList 中定义了一个成员变量modCount,记录集合被修改的次数。集合每次新增或者删除元素,就会给modCount+1。
当用户创建迭代器的时候,我们把modCount 值传递给迭代器的 expectedModCount 成员变量,之后每次调⽤迭代器上的next()方法,我们都会检查集合上的 modCount 是否等于expectedModCount,也就是判断在创建完迭代器之后,集合是否改变过。

 private class Itr implements Iterator<E> {int cursor;       // index of next element to returnint lastRet = -1; // index of last element returned; -1 if no suchint expectedModCount = modCount;Itr() {}public boolean hasNext() {return cursor != size;}@SuppressWarnings("unchecked")public E next() {checkForComodification();int i = cursor;if (i >= size)throw new NoSuchElementException();Object[] elementData = ArrayList.this.elementData;if (i >= elementData.length)throw new ConcurrentModificationException();cursor = i + 1;return (E) elementData[lastRet = i];}final void checkForComodification() {if (modCount != expectedModCount)throw new ConcurrentModificationException();}}

总结

集合遍历⼀般有三种⽅式:for 循环、foreach 循环、迭代器遍历。
后两种本质上属于⼀种,都可以看作迭代器遍历。

相对于 for 循环遍历,利⽤迭代器来遍历有下⾯三个优势:

  1. 迭代器模式封装集合内部的复杂数据结构,开发者不需要了解如何遍历,直接使⽤容器提供的迭代器即可
  2. 迭代器模式将集合对象的遍历操作从集合类中拆分出来,放到迭代器类中,让两者的职责更加单⼀ (对于复杂的数据结构,图,树等,客户端自己实现遍历算法比较复杂也容易出错)
  3. 因为迭代器都实现⾃相同的接⼝,在开发中,基于接⼝⽽⾮实现编程,替换/新增迭代器也变得更加容易

相关文章:

【设计模式】备忘录模式和迭代器模式

备忘录模式和迭代器模式备忘录模式代码示例迭代器模式代码示例使用迭代器遍历集合的同时不能删除/增加元素总结备忘录模式 备忘录模式&#xff0c;也叫快照&#xff08;Snapshot&#xff09;模式。 在 GoF的《设计模式》⼀书中&#xff0c;备忘录模式是这么定义的&#xff1a;…...

rapidcsv 写csv文件实例

csv实质是一个文本文件&#xff0c;可以使用rapidcsv写文件操作&#xff0c;如下实例&#xff1a; 第一行实质是从-1行开始&#xff0c;列是从0开始 #include "rapidcsv.h" #include <string> using namespace std; void CMFCApplication1Dlg::OnBnClickedBu…...

数据库--进阶篇--9--存储引擎

MySQL体系结构 索引是在引擎层&#xff0c;所以不同的存储引擎&#xff0c;它的索引结构不同。 存储引擎简介 存储引擎就是存储数据、建立所以、更新/查询数据等技术的实现方式。存储引擎是基于表的&#xff0c;而不是基于库的&#xff0c;所以存储引擎也可以被称为表类型。 …...

物品的管理的隐私政策

本应用尊重并保护所有使用服务用户的个人隐私权。为了给您提供更准确、更有个性化的服务&#xff0c;本应用会按照本隐私权政策的规定使用和披露您的个人信息。但本应用将以高度的勤勉、审慎义务对待这些信息。除本隐私权政策另有规定外&#xff0c;在未征得您事先许可的情况下…...

深度解析首个Layer3 链 Nautilus Chain,有何优势?

以流支付为主要概念的Zebec生态&#xff0c;正在推动流支付这种新兴的支付方式向更远的方向发展&#xff0c;该生态最初以Zebec Protocol的形态发展&#xff0c;并从初期的Solana进一步拓展至BNB Chian以及Near上。与此同时&#xff0c;Zebec生态也在积极的寻求从协议形态向公链…...

配对变量t检验

区别双变量t检验&#xff0c;见&#xff1a;https://mp.csdn.net/postedit/100640098 配对变量为两两相关的变量&#xff1a;如敷药前后体重变化。 要求&#xff1a;两变量服从正态分布。 SPSS演练 打开数据文件&#xff1a;ptest.sav 载地址&#xff1a;https://download.c…...

蓝桥杯三月刷题 第八天

文章目录&#x1f4a5;前言&#x1f609;解题报告&#x1f4a5;分数&#x1f914;一、思路:&#x1f60e;二、代码&#xff1a;&#x1f4a5;回文日期&#x1f914;一、思路:&#x1f60e;二、代码&#xff1a;&#x1f4a5;迷宫&#x1f914;一、思路:&#x1f60e;二、代码&a…...

EXCEL技能点3-常用技能1

1 引用格式 公式中引用单元格或者区域时,引用的类型可分为以下三种: 绝对引用 相对引用 混合引用 在Excel里&#xff0c;每个单元格都有一个编码&#xff0c;就像人的身份证一样&#xff0c;在Excel里是按照行列进行编码&#xff0c;例如A1就是第一列的第一行。 那么我们想要引…...

经典分类模型回顾16-AlexNet实现垃圾分类(Tensorflow2.0版)

AlexNet是2012年由亚历克斯克里斯托夫&#xff08;Alex Krizhevsky&#xff09;等人提出的一种卷积神经网络结构&#xff0c;它在ImageNet图像识别比赛中获得了第一名&#xff0c;标志着卷积神经网络的崛起。 AlexNet的结构包括8层网络&#xff0c;其中前5层为卷积层&#xff…...

vue3使用vuex

第一步安装&#xff1a; package.json { "name": "demo", "version": "0.1.0", "private": true, "scripts": { "serve": "vue-cli-service serve", "build": "vue-c…...

Java面向对象:抽象类的学习

本文介绍了抽象类的基本语法概念,什么是抽象类. Java中抽象类的语法,抽象类的特性 抽象类的作用(抽象类和普通类的区别) 用抽象类实现多态… 抽象类的学习一.什么是抽象类二.抽象类语法三.抽象类的特性四.抽象类的作用五. 抽象类实现多态一.什么是抽象类 在面向对象的概念中&am…...

modbus转profinet网关连接5台台达ME300变频器案例

通过兴达易控Modbus转Profinet&#xff08;XD-MDPN100&#xff09;网关改善网络场景&#xff0c;变频器有掉线或数据丢失报警&#xff0c;影响系统的正常运行&#xff0c;将5台 ME300变频器modbus转Profinet到1200PLC&#xff0c;通过网关还可以实现Profinet转modbus RTU协议转…...

多校园SaaS运营智慧校园云平台源码 智慧校园移动小程序源码

智慧校园管理平台源码 智慧校园云平台源码 智慧校园全套源码包含&#xff1a;电子班牌管理系统、成绩管理系统、考勤人脸刷卡管理系统、综合素养评价系统、请假管理系统、电子班牌发布系统、校务管理系统、小程序移动端、教师后台管理系统、SaaS运营云平台&#xff08;支持多学…...

用DQN实现Atari game(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 强化学习研究的是Agent和环境交互中如何学习最优策略&#xff0c;以获得最大收益。Agent需要能够观察环境(observe)所处的状态&…...

【JavaSE专栏11】Java的 if 条件语句

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;Java全栈软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发&#xff08;Vue、SpringBoot和微信小程序&#xff09;、系统定制、远程技术指导。CSDN学院、蓝桥云…...

【opensea】opensea-js 升级 Seaport v1.4 导致的问题及解决笔记

一、opensea 协议升级导致旧包不能使用了 我使用的是 “opensea-js”: "^4.0.12” 版本当SDK。于2023年3月9日之后&#xff0c;不能使用了&#xff0c;需要升级到 Seaport v1.4 协议的包。 报错如下: Error: API Error 400: Please provide an OPEN order type when us…...

JS语法(扫盲)

文章目录一、初识JavaScript二、第一个JS程序JS代码的引入JS程序的输出三、语法变量使用动态类型内置类型运算符强类型语言&弱类型语言条件语句循环语句数组创建数组获取数组元素新增数组元素删除数组元素函数语法格式形参实参个数的问题匿名函数&函数表达式作用域作用…...

归并排序的学习过程(代码实现)

归并排序的学习过程 在知乎上搜索相关内容&#xff1a; 先在必应和知乎上搜索归并排序的概念&#xff1a; 归并排序&#xff08;Merge sort&#xff09;是建立在归并操作上的一种有效的排序算法。该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型…...

add_header重写的坑

问题描述&#xff1a; nginx 的 add_header 配置在很多文档中都标注为&#xff1a;“可以覆盖响应头”&#xff0c;然而并没有说出使用场景&#xff0c;导致不少开发人员在使用 add_header 时都出现了错误&#xff1a;add_header 根本没有重写响应头&#xff01; add_header 的…...

跑步耳机入耳好还是不入耳好,最适合运动的蓝牙耳机

运动耳机在户外佩戴牢固度以及佩戴舒适度是十分重要的&#xff0c;入耳式的耳机在佩戴当中会更有沉浸式听感&#xff0c;骨传导耳机在运动当中佩戴更舒适、更牢固。在选购时可以按照自己的需求来选购&#xff0c;希望看完这篇对你有所帮助。 1、南卡Runner Pro4骨传导蓝牙运动…...

深度学习知识点简单概述【更新中】

文章目录人工神经网络的定义神经元的定义神经元的功能单层神经网络感知机人工神经网络的定义 人工神经网络(英语:Artificial Neural Network&#xff0c;ANN)&#xff0c;简称神经网络(Neural Network,NN&#xff09;或类神经网络&#xff0c;是一种模仿生物神经网络(动物的中…...

【编程基础】009.输入两个正整数m和n,求其最大公约数和最小公倍数。

最大公约数与最小公倍数 题目描述 输入两个正整数m和n&#xff0c;求其最大公约数和最小公倍数。 输入格式 两个整数 输出格式 最大公约数&#xff0c;最小公倍数 样例输入 5 7 样例输出 1 35 题目思路 在这里我们用m表示较大的那个数&#xff0c;n表示较小的数。求…...

Golang错误处理

介绍 如果你写过任何 Go 代码,你可能遇到过内置error类型。Go 代码使用error值来指示异常状态。例如,函数在打开文件失败时os.Open返回一个非零值。error func Open(name string) (file *File, err error) 下面的代码用于os.Open打开一个文件。如果发生错误,它会调用log.Fat…...

English Learning - L2 语音作业打卡 复习对比 [ɑ:] [æ] Day18 2023.3.10 周五

English Learning - L2 语音作业打卡 复习对比 [ɑ:] [] Day18 2023.3.10 周五&#x1f48c;发音小贴士&#xff1a;&#x1f48c;当日目标音发音规则/技巧:&#x1f36d; Part 1【热身练习】&#x1f36d; Part2【练习内容】&#x1f36d;【练习感受】&#x1f353;元音 [ɑ:]…...

LabVIEW中以编程方式获取VI克隆名称

LabVIEW中以编程方式获取VI克隆名称演示如何以编程方式获取VI的名称或克隆名称。如果VI作为顶级VI运行&#xff0c;则将显示VI的名称。如果VI在主VI中用作子VI&#xff0c;它将返回克隆的名称。在项目开发过程中&#xff0c;有时需要获取VI的名称。在此示例中&#xff0c;实现了…...

Mysql count(*)的使用原理以及InnoDb的优化策略

Mysql count的原理你真的了解吗&#xff1f;1、数据库引擎的区别2、InnoDB中count的使用3、innodb对select(\*)的优化/为什么select(\*)通过非聚集索引效率要高于聚集索引面试问到说“你觉得count(*) 的效率怎么样&#xff1f;”&#xff0c;一般回复innodb对count(*)进行优化后…...

一文入门HTML+CSS+JS(样例后续更新)

一文入门HTMLCSSJS&#xff08;样例后续更新&#xff09;前言HTML&#xff0c;CSS和JS的关系HTMLhead元素titlelinkmetabody元素设置网页正文颜色与背景颜色添加网页背景图片设置网页链接文字颜色设置网页边框文字与段落标记普通文字的输入对文字字体的设置 font使用文字的修饰…...

【STL】Vector剖析及模拟实现

✍作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;C vector的常用接口 首先贴上&#xff1a;vector的文档介绍,以备查阅使用。 vector的基本框架&#xff1a; vector的成员变量分别是空间首部分的_start指针和最后一个元素的下一个位置的_finish指针&#xff0c;以…...

数据库建表的一些技巧

文章目录 1.名字1.1 见名知意1.2 大小写1.3 分隔符1.4 表名1.5 字段名称1.6 索引名2.字段类型3.字段长度4.字段个数5. 主键6.存储引擎7. NOT NULL8.外键9. 索引10.时间字段11.金额字段12.唯一索引13.字符集14. 排序规则15.大字段总结如果我们在建表的时候不注意细节,等后面系统…...

线程(一)

线程 1. 线程 定义&#xff1a;线程是进程的组成部分&#xff0c;不同的线程执行不同的任务&#xff0c;不同的功能模块&#xff0c;同时线程使用的资源师由进程管理&#xff0c;主要分配CPU和内存。 ​ 在进程中&#xff0c;线程执行的方式是抢占式执行操作&#xff0c;需要考…...