设计模式—观察者模式(Observer)
目录
思维导图
一、什么是观察者模式?
二、有什么优点吗?
三、有什么缺点吗?
四、什么时候使用观察者模式?
五、代码展示
①、双向耦合的代码
②、解耦实践一
③、解耦实践二
④、观察者模式
六、这个模式涉及到了哪些知识点?
思维导图
一、什么是观察者模式?
又叫发布-订阅(publish/Subscrib)模式。定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
观察者类似于卧底这样一个角色。在上班的时候,难免会有人趁老板不在的时候做一些工作之外的事情,例如炒炒股,看看NBA之类的,那如何应对老板突然回来这件事情呢?我们就需要卧底这样一个人给我们放风,老板一回来就通知这些人“老板回来了”。这其实就是一种观察者模式
Subject类:它把所有对观察者对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。
Observer类:抽象观察者,为所有的具体观察者定义一个接口,在得到主题的通知时更新自己。
ConcreteSubject类:具体主题,将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。
ConcreteObserver类:具体观察者,实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。
二、有什么优点吗?
观察者模式所做的工作其实就是在解除耦合,让耦合的双方都依赖于抽象,而不是依赖于具体。从而使得各自的变化都不会影响另一边的变化。满足依赖倒转原则
三、有什么缺点吗?
如果观察者很多的话,一个一个的通知会影响效率
四、什么时候使用观察者模式?
当一个对象的改变需要同时改变其他对象的时候。
而且它不知道具体有多少对象有待改变时,应该考虑使用观察者模式。
五、代码展示
场景:小菜公司的同事在老板外出的期间偷偷地通过网页看股票行情,但是一不小心老板就回来了,让老板看到工作的时候做这些总是不太好的,如果避免这样的情况呢?就需要前台秘书这样的一个卧底,老板一回来了,前台秘书童子喆就拨了个电话告诉同事。但有一次因为老板回来直接就找童子喆做一些其他事情,童子喆就没来得及打电话,导致同事就没被通知到“老板回来了”
①、双向耦合的代码
//前台秘书类class Secretary{//同事列表private IList<StockObserver> observers = new List<StockObserver>(); //IList接口,List泛型,集合数据类型是StockObserverprivate string action; //成员变量//构造方法public Secretary() { }//增加public void Attach(StockObserver observer){observers.Add(observer); //向集合里面添加同事}//通知public void Notify(){foreach (StockObserver o in observers) //foreach遍历集合:数据类型 变量名 in 遍历的集合o.Update(); //一个一个的给同事通知}//前台状态public string SecretaryAction{get { return action; } //get访问器set { action = value; } //set访问器}}//看股票同事类class StockObserver{private string name; //字符串成员变量private Secretary sub; //前台秘书类类型成员变量public StockObserver(string name, Secretary sub) //构造方法{this.name = name; //赋值this.sub = sub;}public void Update() //通知{Console.WriteLine("{0}{1}关闭股票行情,继续工作!", sub.SecretaryAction, name); //要通知的语句}}
客户端代码:
//前台小姐童子喆
Secretary tongzizhe = new Secretary();//看股票的同事
StockObserver tongshi1 = new StockObserver("魏关姹", tongzizhe);
StockObserver tongshi2 = new StockObserver("易管查", tongzizhe);//前台记下了两位同事
tongzizhe.Attach(tongshi1);
tongzizhe.Attach(tongshi2);//发现老板回来
tongzizhe.SecretaryAction = "老板回来了";//通知两个同事
tongzizhe.Notify();Console.ReadKey ();
问题:前台类和看股票者类之间互相耦合。
②、解耦实践一
抽象观察类
abstract class Observer
{protected string name;protected Secretary sub;public Observer(string name, Secretary sub) //有参的构造方法{this.name = name;this.sub = sub;}//通知public abstract void Update();
}
看股票的同事
class StockObserver : Observer
{//继承父类的构造方法public StockObserver(string name, Secretary sub) : base(name, sub) { }public override void Update(){Console.WriteLine("{0}{1} 关闭股票行情,继续工作!", sub.SecretaryAction, name);}
}
看NBA的同事
class NBAObserver : Observer
{public NBAObserver(string name, Secretary sub) : base(name, sub) { }public override void Update(){Console.WriteLine("{0}{1} 关闭NBA直播,继续工作!", sub.SecretaryAction, name);}
}
前台秘书类
class Secretary{private IList<Observer> observers = new List<Observer>(); //集合private string action; //成员变量//增加public void Attach(Observer observer) //针对抽象编程,减少了与具体类的耦合{observers.Add(observer);}//减少public void Detach(Observer observer) //针对抽象编程,减少了与具体类的耦合{observers.Remove(observer);}//通知public void Notify(){foreach (Observer o in observers)o.Update();}//前台状态public string SecretaryAction //属性{get { return action; }set { action = value; }}}
客户端代码
//前台小姐童子喆
Secretary tongzizhe = new Secretary();//看股票的同事
StockObserver tongshi1 = new StockObserver("魏关姹", tongzizhe);
StockObserver tongshi2 = new StockObserver("易管查", tongzizhe);//前台记下了两位同事
tongzizhe.Attach(tongshi1);
tongzizhe.Attach(tongshi2);//发现老板回来
tongzizhe.SecretaryAction = "老板回来了";//通知两个同事
tongzizhe.Notify();Console.ReadKey ();
③、解耦实践二
通知者接口
interface Subject{void Attach(Observer observer); //增加void Detach(Observer observer); //减少void Notify(); //通知string SubjectState //前台状态{get;set;}}
老板
class Boss : Subject{//同事列表private IList<Observer> observers = new List<Observer>();private string action;//增加public void Attach(Observer observer){observers.Add(observer);}//减少public void Detach(Observer observer){observers.Remove(observer);}//通知public void Notify(){foreach (Observer o in observers)o.Update();}//前台状态public string SubjectState{get { return action; }set { action = value; }}}
前台秘书类
class Secretary{//同事列表private IList<Observer> observers = new List<Observer>();private string action;//增加public void Attach(Observer observer){observers.Add(observer);}//减少public void Detach(Observer observer){observers.Remove(observer);}//通知public void Notify(){foreach (Observer o in observers)o.Update();}//前台状态public string SubjectState{get { return action; }set { action = value; }}}
抽象观察者
abstract class Observer{protected string name; //成员变量,姓名protected Subject sub; //成员变量,通知者public Observer(string name, Subject sub) //构造方法{this.name = name; //赋值this.sub = sub;}public abstract void Update();}
看股票的同事
class StockObserver : Observer{public StockObserver(string name, Subject sub) : base(name, sub) { }public override void Update(){Console.WriteLine("{0}{1} 关闭股票行情,继续工作!", sub.SubjectState, name);}}#endregion
客户端代码
//老板胡汉三
Boss huhansan = new Boss();//看股票的同事
StockObserver tongshi1 = new StockObserver("魏关姹", huhansan);
//看NBA的同事
StockObserver tongshi2 = new StockObserver("易管查", huhansan);huhansan.Attach(tongshi1);
huhansan.Attach(tongshi2);huhansan.Detach(tongshi1); //魏关姹其实是没有被老板通知到,所以减去//老板回来
huhansan.SubjectState = "我胡汉三回来了";
//发出通知
huhansan.Notify();Console.ReadKey();
④、观察者模式
Subject:抽象通知者/主题,一般用一个抽象类或者一个接口实现.它把所有对观察者对象的引用保存在一个聚集里,每个主题都可以由任何数量的观察者.抽象主题提供一个接口,可以增加和删除观察者对象
abstract class Subject{private IList<Observer> observers = new List<Observer>();//增加观察者public void Attach(Observer observer){observers.Add(observer);}//删除观察者public void Detach(Observer observer){observers.Remove(observer);}//通知public void Notify(){foreach (Observer o in observers)o.Update();}}
Observer类:抽象观察者,为所有的具体观察者定义一个接口,在得到主题的通知时更新自己.这个接口叫做更新接口.抽象观察者一般用一个抽象类或者一个接口实现.更新接口通常包含一个Update()方法,这个方法叫做更新方法.
abstract class Observer
{public abstract void Update();
}
ConcreteSubject:具体主题/具体通知者,将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知.具体主题角色同一个具体子类实现.
class ConcreteSubject : Subject
{private string subjectState;//具体被观察者状态public string SubjectState{get { return subjectState; }set { subjectState = value; }}
}
// ConcreteObserver:具体观察者,实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调.具体观察者角色可以保存一个指向具体主题对象的引用.具体观察者角色通常用一个具体子类实现.
class ConcreteObserver : Observer{//成员变量private string name;private string observerState;private ConcreteSubject subject;//构造方法public ConcreteObserver(ConcreteSubject subject,string name){this.subject = subject; //赋值this.name = name;}//重写抽象类Update方法public override void Update(){observerState = subject.SubjectState; //赋值Console.WriteLine("观察者{0}的新状态是{1}", name, observerState); //控制台输出结果}//具体观察者状态public ConcreteSubject Subject {get { return subject; }set { subject = value; }}}
观察者模式的动机是将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就需要维护相关对象间的一致性.我们不希望为了维持一致性而使各类紧密耦合,这样会给维护\扩展和重用都带来不便.
六、这个模式涉及到了哪些知识点?
①、一个类里面有哪些东西?
②、字段和属性
字段
是什么?与类相关的变量;
干什么的?用来保存数据
属性
是什么?一个方法或一对方法
什么作用?具有两个方法,get、set访问器,读、写值
- get访问器:返回与声明的属性相同的数据类型,表示的意思是调用时可以得到内部字段的值或引用;
- set访问器:没有显式设置参数,但它有一个隐式参数,用关键字value表示,它的作用是调用属性时可以给内部的字段或引用赋值
显示和隐式字段初始化
字段的初始值必须是编译时可确定的。
如果没有初始化语句,字段的值会被编译器设为默认值,默认值由字段的类型决定。每种值类型的默认值都是0,bool型是false,引用类型默认为null。
class MyClass、
{int F1; //初始化为0 -值类型string F2; //初始化为null -引用类型int F3 =25; //初始化为25string F4="abcd"; //初始化为“abcd”//声明多个字段,东逗号分隔int F1,F3 =25;string F2,F4="abcd";
}
③、访问修饰符
什么作用?指定程序的其他部分如何访问成员
有哪些?
- private:私有的,只在类的内部可访问,成员默认是这个
- public:公有的,对任何类可访问
- protected:受保护的,只允许该类的派生类访问
- internal:内部的,同一项目所有类可访问
④、构造方法
目的:对类进行初始化
特点:与类同名,无返回值、无void、在new时候调用
所有的类都有构造方法,不带参数的构造方法称为“默认构造方法”,如果你不编码则系统默认生成空的构造方法。若定义了新的构造方法,那么默认的构造方法就会失效。
⑤、方法重载
目的:在不改变原方法的基础上,新增功能
特点:一同二不同:多个方法名相同、参数类型/个数不同
class Animal
{private string name;//方法重载:方法名相同、数据类型/个数不同public Animal(){} //无参的构造方法public Animal(string name) //有参的构造方法{this.name = name;}
}
⑥、foreach循环
连续访问数组中的每一个元素。
//语法
foreach(Type Identifier in ArrayName)Statement//实例
int[] arr1 = {10,11,12,13};foreach(int item in arr1)Console.WriteLine("Item Value:{0}",item);
⑦、List泛型集合
- arrayList集合:不知道存什么类型,不知道存多少个
- List:知道存什么类型,不知道存多少个。就是为了专门处理某种类型,在尖括号中写什么类型,这个集合就变成了什么类型的集合
- 添加数据、插入数据、索引访问数据都是这个类型的,不用考虑所有的转换问题
static void Main(string[] args)
{List<int> list = new List<int>(); //实例化int类型//随机的往这个List集合中添加十个数字,不能重复,求和,求最大值,求最小值,求平均值Random r = new Random();int num = 0;while (list.Count !=10){num = r.Next(1, 100);if (!list.Contains (num)){list.Add(num);}}Console.WriteLine("最大值:{0}",list.Max ());Console.WriteLine("最小值:{0}",list.Min ());Console.WriteLine("和为:{0}",list .Sum ());Console.WriteLine("平均值为:{0}",list.Average ());Console.ReadKey();List<string> listStr = new List<string>(); //实例化string类型listStr.Add("哈哈,小杨又变帅了");
}
⑧、数组、ArrayList和List三者之间的对比:
⑨、抽象类
目的:抽取相同代码,实现封装思想
特点:
- 抽象类不能实例化;
- 抽象方法是必须被子类重写的方法;
- 如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其他一般方法
⑩、重写
将父类实现替换为它自己的实现
虚成员 | 抽象成员 | |
关键字 | virtual | abstract |
实现体 | 有实现体 | 没有实现体,被分号取代 |
在派生类中被覆写 | 可重写,也可不重写,使用override | 必须被重写,使用override |
⑩①、接口
接口提出了一种契约(或者说规范),让使用接口的程序设计人员必须严格遵守接口提出的约定。接口就可以看做是这种标准,它强制性地要求派生类必须实现接口约定的规范,以保证派生类必须拥有某些特性。
特点:
- 不能实例化;
- 不能有构造方法和字段;
- 不能有修饰符;
- 接口包含(事件、索引器、方法、属性);
- 不包含方法的实现;
- 实现接口的类必须实现接口中的所有方法和属性
⑩②、六大原则:依赖倒转原则
-高层模块不应该依赖底层模块。两个都应该依赖抽象(接口/抽象类)。
-抽象不应该依赖细节(具体类)。细节应该依赖抽象。
我现在要设计一个汽车,我先设计汽车大概的样子,先设计轮胎,根据轮胎在设计底盘,根据底盘在设计车身。现在我想要修改轮胎的尺寸,是不是就需要修改底盘,修改车身,整个全部都得修改?如果我们倒过来看,在设计车身,根据车身在设计底盘,根据底盘在设计轮胎,这样的话如果轮胎的尺寸变了,也不会影响到其他的部分
谁也不要依赖谁,除了约定的接口,大家都可以灵活自如。
针对书上所举的例子:无论主板、CPU、内存、硬盘都是在针对接口设计的。CPU作为主板上一个可移动的、可扩展的部分,在设计主板的时候只需要把接口定义好,内部再复杂我也不让外界知道,而主板只需要预留与CPU阵脚的插槽就可以了。内存、硬盘、显卡都是如此,哪部分坏了直接更换那部分就行了,而不会导致整个主板全部都要换。
⑩③、六大关系
- 依赖:使用关系,一个类的使用需要另一个类的协助
实现:局部变量、构造方法的参数、静态方法的调用
图形:虚线+箭头,指向被拥有者
Animal {Public Water Grownup(Water water) {return null;}
}
- 关联:拥有关系,一个类需要使用另一个类的属性和方法
实现:成员变量
图形:实线+箭头
class Water {public Climate m_Climate;public Water(){}
}class Climate {public Climate() {}
}
- 聚合:整体和部分的关系,部分不能脱离整体而单独存在
实现:成员变量+构造方法的参数赋值
图形:实线+空心菱形,菱形指向整体
class GooseGroup {public Goose goose;Public GooseGroup(Goose goose) {this.goose = goose;}
}
class Work
{private State current;public Work(){current = new ForenoonState();}
}
- 继承:子类继承父类
实现:子类:父类
图形:实线+空心三角形,箭头指向父类
class Cat:Animal
{}
- 实现:类和接口的关系,类实现接口的所有特征
实现:类:接口
图形:虚线+空心三角,箭头指向接口
Class WideGoose:Ifly
{ }
相关文章:
设计模式—观察者模式(Observer)
目录 思维导图 一、什么是观察者模式? 二、有什么优点吗? 三、有什么缺点吗? 四、什么时候使用观察者模式? 五、代码展示 ①、双向耦合的代码 ②、解耦实践一 ③、解耦实践二 ④、观察者模式 六、这个模式涉及到了哪些…...
分类算法系列③:模型选择与调优 (Facebook签到位置预测)
目录 模型选择与调优 1、介绍 模型选择(Model Selection): 调优(Hyperparameter Tuning): 本章重点 2、交叉验证 介绍 为什么需要交叉验证 数据处理 3、⭐超参数搜索-网格搜索(Grid Search) 介绍…...
PCL RANSAC分割提取多个空间圆
目录 一、概述二、代码实现三、结果展示1、原始数据2、提取结果四、测试数据本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、概述 使用PCL分割提取多个空间圆,其核心原理仍然是RANSAC拟合空间圆,这里只是做简单修改…...
Java八股文学习笔记day01
01.和equals区别 对于字符串变量来说,使用""和"equals"比较字符串时,其比较方法不同。""比较两个变量本身的值,即两个对象在内存中的首地址,"equals"比较字符串包含内容是否相同。 对于非…...
vant的NavBar导航栏可以自定义背景图片吗
可以的,Vant的NavBar导航栏提供了一个background-image属性,可以设置自定义背景图片。例 如: <van-nav-bar title"标题" left-text"返回" left-arrow background-image"url(https://example.com/image.jpg)&qu…...
深入浅出AXI协议(5)——数据读写结构读写响应结构
目录 一、前言 二、写选通(Write strobes) 三、窄传输(Narrow transfers) 1、示例1 2、示例2 四、字节不变性(Byte invariance) 五、未对齐的传输(Unaligned transfers) 六…...
IntelliJ Idea开发Vue遇到的几个问题
IntelliJ Idea开发Vue遇到的几个问题 确保 idea已安装插件【Vue.js】 问题1:ts方法错误 或 提示导入 import xxx.vue标红 解决办法:在 env.d.ts中添加以下代码(若无此文件,重新创建): /* eslint-disable */ declare module *.…...
sql查找最晚一天/日期最大的一条记录 两种方法
例:查找最晚入职员工的所有信息 建表: CREATE TABLE employees ( emp_no int(11) NOT NULL, birth_date date NOT NULL, first_name varchar(14) NOT NULL, last_name varchar(16) NOT NULL, gender char(1) NOT NULL, hire_date date NOT NULL, PRIMA…...
详解python的
详解& 在Python中,使用&符号可以求取两种数据类型的交集: 集合(Set):你可以使用&来计算两个集合的交集。例如: set1 {1, 2, 3, 4} set2 {3, 4, 5, 6} common_elements set1 & set2 pri…...
Modbus TCP通信笔记
目录 1 Modbus TCP 数据协议1.1 数据格式1.2 报文头(MBAP头)1.3 功能码1.4 Modbus 地址映射到 CPU 地址 2 Modbus TCP 通讯数据示例2.1 功能码01 读离散输出线圈2.2 功能码02 读离散输入线圈2.3 功能码03 读保持寄存器2.4 功能码04 读输入寄存器2.5 功能码05 写单个离散输出寄存…...
CIM和websockt-实现实时消息通信:双人聊天和消息列表展示
欢迎大佬的来访,给大佬奉茶 一、文章背景 有一个业务需求是:实现一个聊天室,我和对方可以聊天;以及有一个消息列表展示我和对方(多个人)的聊天信息和及时接收到对方发来的消息并展示在列表上。 项目框架概…...
useLayoutEffect和useEffect有什么作用?
useEffect 和 useLayoutEffect 都是 React 中的钩子函数,用于在组件渲染过程中执行副作用操作。它们的主要区别在于执行时机。 useEffect: useEffect 是异步执行的,它在浏览器渲染完成之后才执行。这意味着它不会阻塞浏览器的渲染过程,因此适合用于处理副作用,如数据获取、…...
django中配置使用websocket终极解决方案
django ASGI/Channels 启动和 ASGI/daphne的区别 Django ASGI/Channels 是 Django 框架的一个扩展,它提供了异步服务器网关接口(ASGI)协议的支持,以便处理实时应用程序的并发连接。ASGI 是一个用于构建异步 Web 服务器和应用程序…...
敦煌网、Jumia等跨境电商平台怎么测评(补单)留评?
评论的重要性是众所周知的,对于想要做卖家运营的人来说,它直接影响着产品的销量和排名 那么如何通过自养号测评来提升销量和排名呢? 我相信大家对这个问题已经有了一定的了解,拥有大量自养号可以通过这些号来通过关键词搜索、浏…...
uni-app之android离线打包
一 AndroidStudio创建项目 1.1,上一节演示了uni-app云打包,下面演示怎样androidStudio离线打包。在AndroidStudio里面新建空项目 1.2,下载uni-app离线SDK,离线SDK主要用于App本地离线打包及扩展原生能力,SDK下载链接h…...
【传输层】TCP -- 三次握手四次挥手 | 可靠性与提高性能策略
超时重传机制连接管理机制三次握手四次挥手滑动窗口拥塞控制延迟应答捎带应答面向字节流粘包问题TCP异常情况TCP小结基于TCP应用层协议理解 listen 的第二个参数 超时重传机制 主机A发送数据给B之后,可能因为网络拥堵等原因,数据无法到达主机B࿱…...
前端将UTC时间格式转化为本地时间格式~~uniapp写法
UTC时间格式是什么 首先我们先简单的了解一下:UTC时间(协调世界时,Coordinated Universal Time)使用24小时制,以小时、分钟、秒和毫秒来表示时间 HH:mm:ss.SSSHH 表示小时,取值范围为00到23。mm 表示分钟…...
说说Kappa架构
分析&回答 对于实时数仓而言,Lmabda架构有很明显的不足,首先同时维护两套系统,资源占用率高,其次这两套系统的数据处理逻辑相同,代码重复开发。 能否有一种架构,只需要维护一套系统,就可以…...
项目介绍:《Online ChatRoom》网页聊天室 — Spring Boot、MyBatis、MySQL和WebSocket的奇妙融合
在当今数字化社会,即时通讯已成为人们生活中不可或缺的一部分。为了满足这一需求,我开发了一个名为"WeTalk"的聊天室项目,该项目基于Spring Boot、MyBatis、MySQL和WebSocket技术,为用户提供了一个实时交流的平台。在本…...
Vue3 学习 组合式API setup语法糖 响应式 指令 DIFF(一)
文章目录 前言一、Composition Api二、setup语法糖三、响应式refreactive 四、其他一些关键点v-prev-oncev-memov-cloak 五、虚拟Dom五、diff算法 前言 本文用于记录学习Vue3的过程 一、Composition Api 我觉得首先VUE3最大的改变就是对于代码书写的改变,从原来选择…...
一文轻松入门DeepSort
1.背景 Deepsort是目标检测任务的后续任务,得益于Yolo系列的大放异彩,DeepSort目标追踪任务的精度也不断提高,同时,DeepSort属于目标追踪任务中的多目标追踪,即MOT(Multiple Object Tracking,M…...
关于linux openssl的自签证书认证与nginx配置
自签文档链接 重点注意这块,不能写一样的,要是一样的话登录界面锁会报不安全 域名这块跟最后发布的一致 nginx配置的话 server {listen 443 ssl; //ssl 说明为https 默认端口为443server_name www.skyys.com; //跟openssl设置的域名保持一致s…...
Mybatis--关联关系映射
目录: 1.什么是关联关系映射: 一对一和多对多的区别 2.mybaits中的一对一&一对多关联关系配置 配置generatoeConfig文件 插件自动生成 编辑 写sql语句 创建 Ordermapper类 编写接口类 编辑 编写接口实现类 编写测试类 测试结果 一对…...
Golang基本的网络编程
Go语言基本的Web服务器实现 Go 语言中的 http 包提供了创建 http 服务或者访问 http 服务所需要的能力,不需要额外的依赖。 Go语言在Web服务器中主要使用到了 “net/http” 库函数,通过分析请求的URL来实现参数的接收。 下面介绍了http 中Web应用的基本…...
Postgresql的一个bug_涉及归档和pg_wal
故障描述: 服务器ocmpgdbprod1,是流复制主节点,它的从节点是ocmpgdbprod2,两个节点的Postgresql数据库版本都是PostgreSQL 11.6,主节点ocmpgdbprod1配置了pg_wal归档,从节点ocmpgdbprod2没有配置pg_wal归档…...
轻量、便捷、高效—经纬恒润AETP助力车载以太网测试
随着自动驾驶技术和智能座舱的不断发展,高宽带、高速率的数据通信对主干网提出了稳定、高效的传输要求,CAN(FD)、LIN已无法充分满足汽车的通信需求。车载以太网作为一种快速且扩展性好的网络技术,已经逐步成为了汽车主干网的首选。 此外&…...
【跟小嘉学 Rust 编程】二十四、内联汇编(inline assembly)
系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学…...
综合实训-------成绩管理系统 V1.1
综合实训-------成绩管理系统 V1.1 1、一维数组数据double 2、我们用元素的位置来当学号。 1、录入数据 【5个数据】或【通过文件的方式取数据】 2、显示数据 3、添加一条记录 4、修改一条记录 5、删除一条记录 6、查找一条记录。【输入学号,显示成绩】 7、统计。【…...
13.108.Spark 优化、Spark优化与hive的区别、SparkSQL启动参数调优、四川任务优化实践:执行效率提升50%以上
13.108.Spark 优化 1.1.25.Spark优化与hive的区别 1.1.26.SparkSQL启动参数调优 1.1.27.四川任务优化实践:执行效率提升50%以上 13.108.Spark 优化: 1.1.25.Spark优化与hive的区别 先理解spark与mapreduce的本质区别,算子之间(…...
大模型综述论文笔记6-15
这里写自定义目录标题 KeywordsBackgroud for LLMsTechnical Evolution of GPT-series ModelsResearch of OpenAI on LLMs can be roughly divided into the following stagesEarly ExplorationsCapacity LeapCapacity EnhancementThe Milestones of Language Models Resources…...
免费做网站方案/如何自己做一个网站
声明是告诉编译器有这么个变量,但并不实现。定义就是实现这个变量,真正在内存(堆或栈中)为此变量分配空间它们的本质区别是:是否分配内存空间,定义需要分配空间,声明不需要分配空间。int i;声明一个i,告诉编…...
费用网站建设/网站站内关键词优化
1.进程概念 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。简而言之,一个进程就是一个正在执行程序的实例。 windows的进程: 2…...
软件开发培训机构去哪个学校深圳/网络优化工程师前景
梯度爆炸 原因:梯度变得非常大,使得学习过程难以继续 现象:观察log,注意每一轮迭代后的loss。loss随着每轮迭代越来越大,最终超过了浮点型表示的范围,就变成了NaN。 措施: 1. 减小solver.prot…...
清远建设工程招投标网站/网站模板库
http://linux.vbird.org/linux_basic/0120howtolinux/0120howtolinux_1.php 請推薦有關網路的書 ----- Original Message ----- From: "網中人" Newsgroups: tw.bbs.comp.network Sent: Thursday, September 27, 2001 2:33 PM Subject: Re: 請推薦有關網路的書.... …...
自己做的网站项目面试/郑州抖音推广
夏天,温度高,虽然热,但也正是做各种面食的好时候,发酵快,成功率也更高。怕孩子胃口不好,所以我便常给他们做迷你小馒头,每周至少会做一次,小巧可爱,孩子2口一个ÿ…...