设计模式—原型模式(Prototype)
目录
一、什么是原型模式?
二、原型模式具有什么优缺点吗?
三、有什么缺点?
四、什么时候用原型模式?
五、代码展示
①、简历代码初步实现
②、原型模式
③、简历的原型实现
④、深复制
⑤、浅复制
一、什么是原型模式?
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节
简单说就是先创建一个原型类实例,然后通过克隆的方法来复制一个一样的新对象,这个对象和原来的对象相同或相似

核心:通过自带的Clone()方法和ICloneable接口创建跟该对象相同的新对象,不需要知道具体的创建细节。
二、原型模式具有什么优缺点吗?
- 隐藏对象创建细节,提高性能:一般在初始化的信息不发生变化的情况下,克隆是最好的办法。这既隐藏了对象创建的细节,又对性能是大大的提高。
- 不用重新初始化对象,而是动态地获得对象运行时的状态;
三、有什么缺点?
- 根据实际应用需要涉及到深浅复制问题;
- 每一个类都需要一个Clone方法;
- Clone方法位于类的内部,当对已有类进行改造的时候,需要修改代码,违背开闭原则;
四、什么时候用原型模式?
- 同一个类当需要实例化多次的时候;
- 对象之间相同或相似,即只是个别的几个属性不同的时候;
五、代码展示
场景:小菜最近在找工作,需要复印大量的简历发给求职公司,小菜和大鸟通过复制简历这个事情来谈到了了六七年前和现在复印简历的不同:六七年前:简历一般都是手写,很珍贵;现在:只要有一份简历原版,直接复印就可以了。对于编程来说,直接Ctrl+C和Ctrl+V直接复制代码就可以了,但简单的复制代码有时候也会带来重复代码的灾难的。大鸟要求小菜写一个简历类,里面必须有姓名、性别、年龄、工作经历,最后要求有三份简历。
①、简历代码初步实现
简历类
//简历
class Resume
{private string name; //姓名private string sex; //性别private string age; //年龄private string timeArea; //工作时间private string company; //公司public Resume(string name) //有参的构造方法{this.name = name; //赋值}//设置个人信息public void SetPersonalInfo(string sex,string age){this.sex = sex; //赋值this.age = age; //赋值}//设置工作经历public void SetWorkExperience(string timeArea,string company){this.timeArea = timeArea; //赋值this.company = company; //赋值}//显示public void Display(){Console.WriteLine("{0}{1}{2}", name, sex, age); //姓名,性别,年龄Console.WriteLine("工作经历:{0}{1}", timeArea, company); //工作经历:工作时间,公司}
}
客户端调用代码
class Program
{static void Main(string[] args){#region 第一种方法//Resume a = new Resume("大鸟 "); //实例化简历对象//a.SetPersonalInfo("男", "29"); //设置个人信息//a.SetWorkExperience("1998-2000 ", "xx公司"); //设置工作经历//Resume b = new Resume("大鸟 ");//b.SetPersonalInfo("男 ", "29");//b.SetWorkExperience("1998-2000 ", "xx公司");//Resume c = new Resume("大鸟 ");//c.SetPersonalInfo("男 ", "29 ");//c.SetWorkExperience("1998-2000 ", "xx公司"); #endregion缺点:每new一次,都需要执行一次构造函数,如果构造函数的执行时间很长,那么多次的执行这个初始化操作就很低效。三份简历就需要实例化3次,如果是需要20份简历,就需要实例化20次,如果98写成99年,就需要改20次。每次实例化出来的对象都存放在堆内存里面,按照这样的方式实例化对堆内存的消耗就非常大。如何改进这个问题呢?可以使用第二种方法,先实例化出来一个对象a,然后把a引用所指向的地址赋值给b和c,这样在堆内存里面#region 第二种方法Resume a = new Resume("大鸟 "); //实例化简历对象a.SetPersonalInfo("男", "29"); //设置个人信息a.SetWorkExperience("1998-2000 ", "xx公司"); //设置工作经历Resume b = a;Resume c = a;#endregiona.Display(); //显示b.Display();c.Display();Console.ReadKey();}
}
如何解决?Clone克隆
②、原型模式

Prototype类
abstract class Prototype //抽象原型类
{private string id; //私有的成员变量public Prototype(string id) //有参的构造方法{this.id = id;}public string Id //属性{get { return id; } //取值}public abstract Prototype Clone(); //抽象克隆方法
}
ConcretePrototype1
class ConcretePrototype1 : Prototype //继承原型类
{private string id;public ConcretePrototype1(string id) : base(id) { } //重写有参的构造方法public override Prototype Clone() //重写原型类抽象方法{//创建当前对象的浅表副本return (Prototype)this.MemberwiseClone(); //返回Prototype类型的克隆对象,括号里的作用是指定要创建的对象种类}
}


③、简历的原型实现
思想
Resume:
- 记录相关属性、方法、变量
- Clone()方法
客户端
- 实例化一个原型对象
- 调用要复制类的Clone()方法进行复制,并返回复制完的对象
方法:创建一个新对象,然后将当前对象的非静态字段复制到该新对象
(复制类型)this.MemberwiseClone();
值类型:逐位复制
引用类型:复制引用但不赋值引用的对象
- 可修改简历
- 显示

简历类
class Resume:ICloneable
{private string name; //姓名private string sex; //性别private string age; //年龄private string timeArea; //工作时间private string company; //公司public Resume(string name) //有参的构造方法{this.name = name; //赋值}//设置个人信息public void SetPersonalInfo(string sex, string age){this.sex = sex; //赋值this.age = age; //赋值}//设置工作经历public void SetWorkExperience(string timeArea, string company){this.timeArea = timeArea; //赋值this.company = company; //赋值}//显示public void Display() //实现接口的方法,用来克隆对象{Console.WriteLine("{0}{1}{2}", name, sex, age); //姓名,性别,年龄Console.WriteLine("工作经历:{0}{1}", timeArea, company); //工作经历:工作时间,公司}public Object Clone() //克隆的方法{return (Object)this.MemberwiseClone();}
}
客户端
static void Main(string[] args)
{Resume a = new Resume("大鸟"); //实例化简历类,调用Resume类有参的构造方法a.SetPersonalInfo("男", "29"); //调用SetPersonalInfo方法,并传值a.SetWorkExperience("1998-2000", "xx公司"); //调用SetWorkExperience方法,并传值//调用Clone方法,实现新简历的生成,并且可以再修改新简历的细节Resume b = (Resume)a.Clone(); //克隆a对象,并赋值给简历对象b,此时a和b一样b.SetWorkExperience("1998-2006", "yy公司"); //b对象可以修改自己简历的细节Resume c = (Resume)a.Clone(); //克隆a对象给简历对象cc.SetPersonalInfo("男", "24"); //c对象可以修改自己简历的细节a.Display(); //显示简历ab.Display(); //显示简历ac.Display(); //显示简历aConsole.ReadKey(); //等待用户按下某键退出
}

问题:‘简历’对象里的数据都是string类型的,如果类当中有对象引用,那么引用的对象数据是不会被克隆过来的。
④、深复制

WorkExperience类
//工作经历类
class WorkExperience : ICloneable
{private string workDate;public string WorkDate{get { return workDate; }set { workDate = value; }}private string company;public string Company{get { return company; }set { company = value; }}public Object Clone() //让“工作经历”类实现克隆方法{return (Object)this.MemberwiseClone();}
}
Resume类
// 简历类
class Resume:ICloneable
{private string name;private string age;private string sex;private WorkExperience work;public Resume (string name) //有参的构造方法{this.name = name; //赋值姓名work = new WorkExperience(); //在“简历”类实例化时同时实例化“工作经历”}//提供Clone方法调用的私有构造函数,以便克隆“工作经历”的数据private Resume(WorkExperience work){this.work = (WorkExperience)work.Clone();}public void SetPersonalInfo(string sex,string age) //设置个人信息{this.sex = sex; //赋值性别this.age = age; //赋值年龄}public void SetWorkExperience (string workDate,string company) //设置工作经历{work.WorkDate = workDate; //赋值工作时间work.Company = company; //赋值公司}public void Display() //显示{Console.WriteLine("{0} {1} {2}", name, sex, age);Console.WriteLine("工作经历:{0}{1}", work.WorkDate, work.Company);}public Object Clone() //克隆方法{//调用私有的构造方法,让“工作经历”克隆完成,//然后再给这个“简历”对象的相关字段赋值,//最终返回一个深复制的简历对象Resume obj = new Resume(this.work);obj.name = this.name;obj.sex = this.sex;obj.age = this.age;return obj;}
}

⑤、浅复制

WorkExperience类
//工作经历
class WorkExperience
{private string workDate; //字段:时间区间public string WorkDate //属性:时间区间{get { return workDate; } //读set { workDate = value; } //写}private string company; //字段:公司public string Company //属性:公司{get { return company; } //读set { company = value; } //写}
}
Resume类
class Resume
{private string name; //姓名private string sex; //性别private string age; //年龄 private WorkExperience work; //工作经历public Resume(string name) //构造方法{this.name = name; //赋值姓名work = new WorkExperience(); //在“简历”类实例化时同时实例化“工作经历”}public void SetPersonalInfo(string sex, string age) //设置个人信息{this.sex = sex; //赋值性别this.age = age; //赋值年龄}public void SetWorkExperience(string workDate, string company) //设置工作经历{work.WorkDate=workDate; //赋值工作时间work.Company=company; //赋值公司}public void Display() //显示{Console.WriteLine("{0} {1} {2}", name, sex, age); //输出姓名,性别,年龄Console.WriteLine("工作经历:{0}{1}", work.WorkDate, work.Company); //输出工作经历:工作时间,公司}public Object Clone() //克隆{return (Object)this.MemberwiseClone(); //返回Object类型的克隆对象}
}
客户端程序代码
Resume a = new Resume("大鸟"); //实例化一个叫大鸟的简历对象,调用有参构造方法
a.SetPersonalInfo("男", "29"); //调用方法,赋值性别,年龄
a.SetWorkExperience("1998-2000", "xx公司"); //调用方法,赋值工作时间,公司Resume b = (Resume)a.Clone(); //克隆对象a给b
b.SetWorkExperience("1998-2006", "yy公司"); //修改细节
//b和c都克隆于a,但当它们都设置了“工作经历”时,我们希望的结果是三个的显示不一样Resume c = (Resume)a.Clone(); //克隆对象a 给c
c.SetPersonalInfo("男", "24"); //调用方法,赋值性别,年龄
c.SetWorkExperience("1998-2003", "zz公司"); //修改细节a.Display(); //显示简历a
b.Display(); //显示简历b
c.Display(); //显示简历cConsole.ReadKey();
它在内存里面的形式是这样的。

六、涉及到的知识点
1、一个类里面有哪些东西?

2、类和实例
什么是类?
就是具有相同的属性和功能的对象的抽象的集合。注意:
- 类名称首字母大写。多个单词则各个首字母大写;
- 对外公开的方法需要用‘public’修饰符。
什么是实例?
就是一个真实的对象。比如我们都是‘人’,而你和我其实就是‘人’类的实例了。
什么是实例化?
创建对象的过程,使用new关键字来创建。
Cat cat = new Cat(); //其实做了两件事情Cat cat; //第一步、声明一个Cat的对象,对象名为cat
cat = new Cat(); //第二步、将此cat对象实例化
3、字段和属性
什么是字段?
是存储类要满足其设计所需要的数据,字段是与类相关的变量。
private string name = ""; //name就是一个字段,私有的类变量
注意:
- 如果在定义字段时,在字段的类型前面使用了readonly关键字,那么字段就为只读字段,它只能在以下两个位置被赋值或者传递到方法中被改变。
- 在定义字段时赋值;
- 在类的构造函数内被赋值,或传递到方法中被改变,而且在构造函数中可以被多次赋值。
属性是什么?
是一个方法或一对方法体。提供对类或对象的访问。
属性怎么用呢?
它有两个方法get和set。
get访问器:从属性获取值。返回与声明的属性相同的数据类型,表示的意思是调用时可以得到内部字段的值或引用;
set访问器:为属性赋值。没有显式设置参数,但它有一个隐式参数,用关键字value表示,它的作用是调用属性时可以给内部的字段或引用赋值。
属性有什么作用?
限制外部类对类中成员的访问权限,定义在类级别上。
private int _age; //年龄
public int Age
{get //也可以直接在属性中进行判断操作、设置限制{if (_age >= 0 && _age <= 150) //如果年龄大于 0并且小于150的,(表示输入正确){return _age; //则返回输入的年龄}else //否则,(表示输入错误){return 18; //返回指定年龄18}}set { _age = value; }
}
静态属性是什么?
在属性前面加static关键字,这个属性就成为了静态属性。
有什么作用呢?
- 不管类是否有实例,它们都是存在的。
- 当从类的外部访问时,必须使用类名引用,而不是实例名。
class Person
{private static string name; //字段public static string Name //属性{get { return name; }set { name = value; }}
}
static void Main(string[] args)
{Person.Name = "小菜"; //不需要实例化Person类即可直接对属性赋值
}
属性和字段的公有部分解释:
内存:
- 字段:分配内存
- 属性:不分配内存
命名规范:
- 字段:Camel大小写
- 属性:Pascal小写
4、修饰符
在变量前面可以加上访问修饰符(readonly、static)

readonly(只读):读取该字段的值不能给字段赋值
static:静态字段,可以直接通过类名访问该字段
5、访问修饰符有哪些?
- public:公有的,对任何类可访问
- private:私有的,只在类的内部可以访问,成员默认是这个
- protected:保护的,只允许该类的派生类访问
- internal:内部的,同一项目所有类可访问

6、this关键字传递的是什么?
- 用于区分类的成员和本地变量或参数;
- 作为调用方法的实参
//this调用成员变量或成员方法
class Person
{private string name; //字段public void setName(string name) //方法{this.name = name; //将参数值赋予类中的成员变量}//成员变量和setName()方法中的形式参数的名称相同,都为name,那么如何区分使用的是哪一个变量呢?//使用this关键字代表本类对象的引用,this.name指Person类中name成员变量,等号后面的name指传过来的形参name
}
this作为方法的返回值
public Book getBook()
{return this; //返回Book类引用
}在getBook()类中,方法的返回值为Book类,所以方法体中使用return this这种形式将Book类的对象返回
this关键字和对象之间有什么关系?
this引用的就是本类的一个对象。
如果省略this会怎么样?
直接写成name=name,只是把形参name赋值给参数变量本身而已,成员变量name的值没有改变
7、构造方法
- 什么时候用?就是对类进行初始化(在创建该类的对象时就会调用)。
- 有哪些特点?与类同名
无返回值
不需要void,在new时候调用
//希望每个小猫一诞生就有姓名
class Cat
{private string name =""; //声明Cat类的私有字符串变量namepublic Cat(string name) //定义Cat类的构造方法,参数是输入一个字符串{this.name =name; //将参数赋值给私有变量name}public string Shout(){return "我的名字叫"+name+" 喵";}
}
注:所有类都有构造方法,如果你不编码则系统默认生成空的构造方法,若有定义的构造方法,那么默认的构造方法就会失效(这个构造方法什么也不做,只是为了让用户能够顺利地实例化)
8、方法重载
是什么?指方法名相同,但参数的数据类型、个数或顺序不同的方法。(一同二不同)
有什么好处?在不改变原方法的基础上,新增功能。
class Animal
{private string name;//方法重载:方法名相同、数据类型、个数/顺序不同public Animal(){} //无参的构造方法public Animal(string name) //有参的构造方法{this.name = name;}
}
9、抽象类
什么是抽象类?
目的:抽取相同代码,实现封装思想
特点:
- 抽象类不能实例化;
- 抽象方法是必须被子类重写的方法;
- 如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其他一般方法
什么是重写?
将父类实现替换为它自己的实现
| 虚成员 | 抽象成员 | |
| 关键字 | virtual | abstract |
| 实现体 | 有实现体 | 没有实现体,被分号取代 |
| 在派生类中被覆写 | 可重写,也可不重写,使用override | 必须被重写,使用override |
10、值类型和引用类型
值类型:修改其中一个对另一个不会有影响,在栈上存的是值
引用类型:对第二个变量修改会影响到第一个变量。因为他们指向同一个引用。在栈上存的是地址,堆上存的是值

11、六大原则
六大原则
12、六大关系
六大关系
七、思维导图

相关文章:
设计模式—原型模式(Prototype)
目录 一、什么是原型模式? 二、原型模式具有什么优缺点吗? 三、有什么缺点? 四、什么时候用原型模式? 五、代码展示 ①、简历代码初步实现 ②、原型模式 ③、简历的原型实现 ④、深复制 ⑤、浅复制 一、什么是原型模式&…...
【pytorch】Unfold和Fold的互逆操作
1. 参数定义 Unfold https://pytorch.org/docs/stable/generated/torch.nn.Unfold.html#torch.nn.Unfold Fold https://pytorch.org/docs/stable/generated/torch.nn.Fold.html#torch.nn.Fold 注意:参数当中的padding是在四周边补零,而当fold后的尺寸…...
【AI】《动手学-深度学习-PyTorch版》笔记(二十一):目标检测
AI学习目录汇总 1、简述 通过前面的学习,已经了解了图像分类模型的原理及实现。图像分类是假定图像中只有一个目标,算法上是对整个图像做的分类。 下面我们来学习“目标检测”,即从一张图像中找出需要的目标,并标记出位置。 2、边界框 边界框:bounding box,就是一个方…...
畅捷通T+用户中locked勒索病毒后该怎么办?勒索病毒解密数据恢复
Locked勒索病毒是一种近年来在全球范围内引起广泛关注的网络安全威胁程序。它是一种加密货币劫持病毒,专门用于加密用户的数据并要求其支付赎金。Locked勒索病毒通过攻击各种系统漏洞和网络薄弱环节,使用户计算机受到感染并被加密锁定时,无法…...
神仙般的css动画参考网址,使用animate.css
Animate.css | A cross-browser library of CSS animations.Animate.css is a library of ready-to-use, cross-browser animations for you to use in your projects. Great for emphasis, home pages, sliders, and attention-guiding hints.https://animate.style/这里面有很…...
江西抚州新能源汽车3d扫描零部件逆向抄数测量改装-CASAIM中科广电
汽车改装除了在外观方面越来越受到消费者的青睐,在性能和实用性提升上面的需求也是日趋增多,能快速有效地对客户指定汽车零部件进行一个改装,是每一个汽车改装企业和工程师的追求,也是未来消费者个性化差异化的要求。下面CASAIM中…...
数据结构学习 --4 串
数据结构学习 --1 绪论 数据结构学习 --2 线性表 数据结构学习 --3 栈,队列和数组 数据结构学习 --4 串 数据结构学习 --5 树和二叉树 数据结构学习 --6 图 数据结构学习 --7 查找 数据结构学习 --8 排序 本人学习记录使用 希望对大家帮助 不当之处希望大家帮忙纠正…...
探索Kotlin K2编译器和Java编译器的功能和能力
文章首发地址 Kotlin K2编译器是Kotlin语言的编译器,负责将Kotlin源代码转换为Java字节码或者其他目标平台的代码。K2编译器是Kotlin语言的核心组件之一,它的主要功能是将Kotlin代码编译为可在JVM上运行的字节码。 K2编译器快速介绍 编译过程ÿ…...
如何安装chromadb
下载最新版本的python3.10 因为chromadb需要sqlite3的最小版本是3.35.0 使用如下命令安装 pip install chromadb 安装完毕后在python3的命令行窗口输入 import chromadb 如果不报错代表成功,如果报错sqlite3的最小版本是3.35.0,使用如下方式解决 …...
vue实现把字符串中的所有@内容,替换成带标签的
前言: 目前有个需求是,要把输入框里面的还有姓名高亮。 要求: 1、必须用 v-html ,带标签的给他渲染 2、把字符串中的全部查找出来,替换掉,注意要过滤已经替换好的,不然就是无限循环了 实现方法:…...
「MySQL-00」MySQL在Linux上的安装、登录与删除
目录 一、安装MySQL 0. 安装前请先执行一遍删除操作,把预装或残留的MySQL删除掉 1. 安装yum源 (解决了在哪里找MySQL的问题) 2. 安装哪个版本的MySQL 二、启动和登录MySQL 三、删除MySQL / MariaDB 安装与卸载前,建议先将用户切换…...
8月29-31日上课内容 第五章
第一章...
数据库导出工具
之前根据数据库升级需求,需要导出旧版本数据(sqlserver 6.5),利用c# winfrom写了一个小工具,导出数据。 →→→→→多了不说,少了不唠。进入正题→→→→ 连接数据库:输入数据库信息 连接成功…...
ChatGPT 制作可视化柱形图突出显示第1名与最后1名
对比分析柱形图的用法。在图表中显示最大值与最小值。 像这样的动态图表的展示只需要给ChatGPT,AIGC,OpenAI 发送一个指令就可以了, 人工智能会快速的写出HTML与JS代码来实现。 请使用HTML,JS,Echarts完成一个对比分析柱形图,在图表中突出显示第1名和最后1名用单独一种不…...
前端学习记录~2023.8.10~JavaScript重难点实例精讲~第6章 Ajax
第 6 章 Ajax 前言6.1 Ajax的基本原理及执行过程6.1.1 XMLHttpRequest对象(1)XMLHttpRequest对象的函数(2)XMLHttpRequest对象的属性 6.1.2 XMLHttpRequest对象生命周期(1)创建XMLHttpRequest对象ÿ…...
2023年Java核心技术第九篇(篇篇万字精讲)
目录 十七 . 并发相关基础概念 17.1 线程安全 17.2 保证线程安全的两个方法 17.2.1 封装 17.2.2 不可变 17.2.2.1 final 和 immutable解释 17.3 线程安全的基本特性 17.3.1 原子性(Atomicity) 17.3.2 可见性(Visibility) 17.3.2.1…...
C#上位机中的单例应用思考
文章目录 一、前言二、上位机单例应用场景2.1 上位机2.2 单例及其应用2.3 上位机中的应用2.3.1 用户登录信息2.3.2 配置文件2.3.3 数据连接池 2.4 一个应用场景的思考 三、总结 一、前言 之前写过一篇关于单例的文——C#中单例模式的实现,讲了讲单例是什么以及在C#…...
Python分享之redis
String 操作 redis中的String在在内存中按照一个name对应一个value来存储 set() #在Redis中设置值,默认不存在则创建,存在则修改 r.set(name, zhangsan) 参数: set(name, value, exNone, pxNone, nxFalse, xxFalse) exÿ…...
Linux常用命令——dd命令
在线Linux命令查询工具 dd 复制文件并对原文件的内容进行转换和格式化处理 补充说明 dd命令用于复制文件并对原文件的内容进行转换和格式化处理。dd命令功能很强大的,对于一些比较底层的问题,使用dd命令往往可以得到出人意料的效果。用的比较多的还是…...
DETR-《End-to-End Object Detection with Transformers》论文精读笔记
DETR(基于Transformer架构的目标检测方法开山之作) End-to-End Object Detection with Transformers 参考:跟着李沐学AI-DETR 论文精读【论文精读】 摘要 在摘要部分作者,主要说明了如下几点: DETR是一个端到端&am…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
软件工程 期末复习
瀑布模型:计划 螺旋模型:风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合:模块内部功能紧密 模块之间依赖程度小 高内聚:指的是一个模块内部的功能应该紧密相关。换句话说,一个模块应当只实现单一的功能…...
Python环境安装与虚拟环境配置详解
本文档旨在为Python开发者提供一站式的环境安装与虚拟环境配置指南,适用于Windows、macOS和Linux系统。无论你是初学者还是有经验的开发者,都能在此找到适合自己的环境搭建方法和常见问题的解决方案。 快速开始 一分钟快速安装与虚拟环境配置 # macOS/…...
