设计模式之美
UML建模
统一建模语言(UML)是用来设计软件的可视化建模语言。它的语言特点是简单 统一 图形化 能表达软件设计中的动态与静态信息。
UML的分类
动态结构图: 类图 对象图 组件图 部署图
动态行为图: 状态图 活动图 时序图 协作图 构件图等
在UML类图中表示具体的类
在类的UML图中,使用长方形描述一个类的主要构成,长方形垂直地分为三层,以此放置类的名称、属性和方法。

在UML类图中表示抽象类
抽象类在UML类图中同样用矩形框表示,但是抽象类的类名以及抽象方法的名字都用斜体字表示,如图所示。

在UML类中表示接口
接口在类图中也是用矩形框表示,但是与类的表示法不同的是,接口在类图中的第一层顶端用构造型<<interface>>表示,下面是接口的名字,第二层是方法。

在UML类图中表示关系
类和类、类和接口、接口和接口之间存在一定关系,UML类图中一般会有连线指明它们之间的关系。









软件设计原则
1.开闭原则
定义:一个软件实体类 模块和函数应该对扩展开放,对修改关闭。
用抽象构建框架,用实现扩展细节
优点: 提高软件系统的可复用性及维护性

开闭原则是所有的设计模式的最核心的目标,顶层设计思维:
- 抽象意识
- 封装意识
- 扩展的意思
2.依赖倒置原则
定义: 高层模块不应该依赖底层模块,二者都应该依赖其抽象
抽象不应该依赖细节;细节应该依赖抽象
针对接口编程,不要针对实现编程
优点: 可以减少类间的耦合度 提高系统稳定性 提高代码可读性和可维护性, 可降低修改程序所造成的风险。


3.单一职责原则
定义: 不要存在多余一个导致类变更的原因
一个类/接口/方法只负责一项职责
优点: 降低类的复杂度 提高类的可读性,提高系统的可维护性,降低变更引起的风险

如何判断一个类的职责是否单一?
- 类中的代码行数 函数 或者属性过多
- 类依赖的其他的类过多
- 私有方法过多
- 类中的大量方法总是操作类中的几个属性
4.接口隔离原则
定义: 用多个专门的接口,而不使用单一的总接口,客户端不应该依赖它不需要的接口
一个类对一个类的依赖应该建立在最小的接口上
建立单一接口,不要建立庞大臃肿的接口
尽量细化接口,接口中的方法尽量少
注意适度原则,一定要适度
优点:符合我们常说的高内聚低耦合的设计思想
从而使得类具有很好的可读性,可扩展性和可维护性。


遵循接口隔离原则的优势
- 将臃肿接口分解成多个粒度晓得接口,可以提高系统的灵活性喝可维护性
- 使用多个专门的接口,还能体现出对象的层次
- 能顾减少项目工程中的冗余代码
5.迪米特法则
定义: 一个对象应该对其他对象保持最少的了解。又叫最少知道原则
尽量降低类与类之间的耦合
优点: 降低类之间的耦合

6.里氏替换原则
什么是替换
替换的前提是面向对象语言所支持的多态特性,同一个行为具有多个不同表现形式或形态的能力
简单说就是当我的一个方法的参数是一个接口类型时,这个方法可以接收所有实现过这个接口的实现类
什么是期望行为一致的替换
在不了解派生类的情况下,仅通过接口或基类的方法,即可清楚的知道方法的行为,而不管哪种派生类的实现,都与接口或基类方法的期望行为一致。

7.总结
单一职责(SRP)
- 概念:一个类只负责完成一个职责或功能
- 作用:1.提高类的内聚性 2.实现代码的高内聚 低耦合
- 不满足的4种情况: 类中的代码行数 函数 或者属性过多
类依赖的其他类过多
私有方法过多
类种大量的方法都是集中操作类中的几个属性
开闭原则(OCP):
概念: 对扩展开放,对修改关闭
开闭原则并不是说完全的杜绝修改,而是以最小的修改代码的代价来完成新功能的开发
作用:新逻辑解耦,需要发生改变不会影响老业务的逻辑
改动成本最小,只需要追加新逻辑,不需要改的老逻辑
提高代码的稳定性喝可扩展性
如何做到开闭原则:
锻炼顶层思维:扩展意识 抽象意识 封装意识
提高代码扩展性的方式:多态 依赖注入 面向接口编程 合理使用设计模式
里氏替换原则(LSP):子类对象能够替换程序中父类对象出现的任何地方,并且保证原来程序的逻辑行为不变及正确性不被破坏
作用:为良好的继承定义了一个规范
提高代码的健壮性,降低程序出错的可能性
里氏替换原则与多态的区别:
多态是面向对象的一大特性,也是面向对象编程语言的一种语法。它是一种代码实现的思路。
里氏替换是一种设计原则,用来指导继承关系中子类该如何设计,在替换父类的时候,不改变原有程序的逻辑及不破坏原有程序的正确性。
接口隔离原则(ISP)
一个类对另一个类的依赖应该建立在最小的接口上,要为各个类建立它们需要的专用接口,而不要试图建立一个很庞大的接口供所有依赖它的类去调用。
作用:提高系统的灵活性喝可维护性
减少项目工程中的代码冗余
接口隔离原则与单一职责原则的区别:
单一职责原则注重的是职责,而接口隔离原则注重的是对接口依赖的隔离。
单一职责原则主要是约束类,它针对的是程序中实现和细节;
接口隔离原则主要是约束接口,主要争对抽象和程序整体框架的构建。
依赖倒置原则(DIP)
概念: 高层模块不应该依赖于底层模块,二者都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。
作用:
减少类间的耦合性,提高系统的稳定性
降低并行开发引起的风险
提高代码的可读性和可维护性
依赖倒置 控制反转 依赖注入 :
依赖倒置: 是一种通用的软件设计原则,主要用来指导框架层面的设计
控制反转: 与依赖倒置有一点相似,它也是一种框架设计常用的模式,但并不是具体的方法。
依赖注入: 是实现控制反转的一个手段,它是一种具体的编码技巧。
迪米特法则(LKP):
概念: 不该有直接依赖关系的类之间,不要有依赖,有依赖的类之间,尽量只依赖必要的接口。
作用:如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发调用。其目的是降低类之间的耦合度,提高模块的相对独立性。
使用注意:过渡使用迪米特法则回使系统大量的中介类,从而增加系统的复杂性,使模块之间的通信效率降低。所以,在采用迪米特法则时需要反复权衡,确保高内聚和低耦合的同时,保证系统的结构清晰。
创建型
简单工厂
适用场景: 工厂类负责创建的对象比较少
客户端(应用层)只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心
优点: 只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节
缺点:工厂类的职责相对过重,增加新的产品 需要修改工厂类的判断逻辑,违背了开闭原则。

/*** 简单工厂Demo*/
public class VideoFactor {//利用反射public Video getVideo(Class c){Video video = null;try{video=(Video) Class.forName(c.getName()).newInstance();} catch (ClassNotFoundException e) {throw new RuntimeException(e);} catch (InstantiationException e) {throw new RuntimeException(e);} catch (IllegalAccessException e) {throw new RuntimeException(e);}return video;}// public Video getVideo(String type) {// if ("java".equals(type)) {// return new JavaVideo();// }else if ("python".equals(type)) {// return new PythonVideo(); // }// return null;// }
}
工厂模式
定义:定义一个创建对象的接口,但让实现这个接口的类来决定实例化那个类,工厂方法让类的实例化推迟到子类中进行。
适用场景: 创建对象需要大量重复的代码
客户端(应用层)不依赖于产品类实例如何被创建 实现等细节
一个类通过其子类来创建那个对象
优点:用户只需要关心所需产品对应的工厂,无须关心创建细节
加入新产品符合开闭原则,提高可扩展性
缺点: 类的个数容易过多,增加复杂度
增加了系统的抽象性和理解难度

抽象工厂模式
定义:抽象工厂模式提供一个创建一些列相关或相互依赖对象的接口
无须指定它们具体的类
适用场景:客户端(应用层)不依赖于产品类实例如何被创建 实现等细节
强调一些列相关的产品对象(属于同一产品族)一起适用创建对象需要大量重复的代码
提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。
优点: 具体产品在应用层代码隔离,无须关心创建细节
将一个系列的产品族统一到一起创建
缺点:规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口。
增加了系统的抽象性和理解难度


建造者模式
定义: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
用户只需指定需要建造的类型就可以得到它们,建造过程及细节不需要知道
适用场景: 如果一个对象有非常复杂的内部结构(很多属性)
想把复杂对象的创建和使用分离
优点: 封装性好,创建和使用分离
扩展性好 建造类之间独立,一定程度上解耦
缺点:
产生多余的Builder对象
产品内部发生变化,建造者都要修改,成本较大
package com.keyi.design.parrttern.builder.v2;public class Course {private String CourseName; private String CoursePPT;private String CourseVideo;private String CourseArticle;public Course(CourseBuilder courseBuilder) {this.CourseName = courseBuilder.courseName;this.CoursePPT = courseBuilder.coursePPT;this.CourseVideo = courseBuilder.courseVideo;this.CourseArticle = courseBuilder.courseArticle;}@Overridepublic String toString() {return "Course{" +"CourseName='" + CourseName + '\'' +", CoursePPT='" + CoursePPT + '\'' +", CourseVideo='" + CourseVideo + '\'' +", CourseArticle='" + CourseArticle + '\'' +'}';}public static class CourseBuilder {private String courseName;private String coursePPT;private String courseVideo;private String courseArticle;public CourseBuilder builderCourseName(String CourseName) {this.courseName = CourseName;return this;}public CourseBuilder builderCoursePPT(String coursePPT) {this.coursePPT = coursePPT;return this;}public CourseBuilder builderCourseVideo(String courseVideo) {this.courseVideo = courseVideo;return this;}public CourseBuilder builderCourseArticle(String courseArticle) {this.courseArticle = courseArticle;return this;}public Course build() {return new Course(this);}}
}
单例模式
保证一个类仅有一个实例,并提供一个全局访问点
适用场景:想确保任何情况下都绝对只有一个实例
优点: 在内存中只有一个实例,减少了内存开销
可以避免对资源的多重占用
设置全局访问点,严格控制访问
缺点: 没有接口,扩展困难
重点: 私有构造器 线程安全 延迟加载 序列化和反序列化安全 反射
单例模式和工厂模式
单例模式和享元模式
懒汉式
特点: 线程安全 内存消耗低 资源开销大 性能有影响
public class LazySingleton {private static LazySingleton lazySingleton=null;private LazySingleton() {}public synchronized static LazySingleton getInstance(){if(lazySingleton==null){lazySingleton=new LazySingleton();}return lazySingleton;}
}


Double Check 双重检查锁的机制
public class LazySingletonDoubleCheck {//volatile 防止多线程中指令重排序 CPU共享内存 可见性private volatile static LazySingletonDoubleCheck lazySingletonDoubleCheck=null;private LazySingletonDoubleCheck() {}public synchronized static LazySingletonDoubleCheck getInstance(){if(lazySingletonDoubleCheck==null){synchronized (LazySingletonDoubleCheck.class){if(lazySingletonDoubleCheck==null){lazySingletonDoubleCheck=new LazySingletonDoubleCheck();//1.分配内存//2.初始化对象//3.设置LazySingletonDoubleCheck 指向刚分配的内存地址}}}return lazySingletonDoubleCheck;}
}
存在问题: 容易被反射破坏(反射可以修改构造器的权限)

public class StaticInnerClassSingleton {public static class InnerClass {private static StaticInnerClassSingleton staticInnerClassSingleton = new StaticInnerClassSingleton();}private StaticInnerClassSingleton() {if (InnerClass.staticInnerClassSingleton != null) {throw new RuntimeException("单例模式禁止被初始化");}}public static StaticInnerClassSingleton getInstance() {return InnerClass.staticInnerClassSingleton;}
}
饿汉式
优点:类加载的时候就开始初始化 避免了线程同步的问题
缺点: 类加载的时候就开始初始化 没有延迟加载的效果 从来没有过 导致内存开销浪费
/*** 饿汉式 类加载的时候就开始了初始化*/
public class HungrySingLeton {private final static HungrySingLeton hungrySingLeton = new HungrySingLeton();private HungrySingLeton() {if (hungrySingLeton!=null){throw new RuntimeException("单例模式禁止被初始化");}}public static HungrySingLeton getInstance(){return hungrySingLeton;}/*** 防止反射获取对象* @return*/public Object readResolve() {return hungrySingLeton;
}
}return hungrySingLeton;}
}
可以防止反射攻击(因为初始化的工作在类加载的时候就已经初始化好了,可以通过私有化构造器判断这个对象是否初始化的状态 来判定对象是否初始化)
枚举单例模式
public enum EnumInstance {INSTANCE;private Object data;public Object getData() {return data;}public void setData(Object data) {this.data = data;}public static EnumInstance getInstance(){return INSTANCE;}
}
解决了反射和序列化和反序列化的问题 (反编译看枚举的构造方法是有参和私有的) 比较像饿汉式 (反编译看初始化操作是静态代码块执行的)
容器单例模式
/*** 容器单例模式*/
public class ContainerSingleton {private static Map<String, Object> singletonMap = new HashMap<>();private ContainerSingleton() {}public static void putInstance(String key, Object instance) {if (StringUtils.isNotBlank(key) && instance != null) {singletonMap.put(key, instance);}}public static Object getInstance(String key) { return singletonMap.get(key);}
}
原型模式
定义: 指原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
不需要指定任何创建的细节,不调用构造函数
适用场景
类初始化消耗较多资源
new产生的一个对象需要非常繁琐的过程(数据准备 访问权限等)
构造函数比较复杂
循环体中生产大量对象时
优点: 原型模式性能比直接new一个对象性能高
简化创建过程
缺点: 必须配备克隆方法
对克隆复杂对象或对克隆出的对象进行复杂改造时,容易引入风险
深拷贝 浅拷贝要运用得当
package com.keyi.design.parrttern.prototype;
//浅克隆
public class Mail implements Cloneable {private String name;private String subject;private String body;public Mail() {System.out.println("Mail object created");}public String getSubject() {return subject;}public void setSubject(String subject) {this.subject = subject;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getBody() {return body;}public void setBody(String body) {this.body = body;}@Overridepublic String toString() {return "Mail{" +"name='" + name + '\'' +", subject='" + subject + '\'' +", body='" + body + '\'' +'}';}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}
public class A implements Cloneable{@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}
public class B extends A{public static void main(String[] args) throws CloneNotSupportedException {B b = new B();B clone = (B) b.clone();}
}
public class Pig implements Cloneable{public String name;private Date age;public Pig(String name, Date age) {this.name = name;this.age = age;}public Date getAge() {return age;}public void setAge(Date age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Pig{" +"name='" + name + '\'' +", age=" + age +'}'+super.toString();}//深克隆@Overrideprotected Object clone() throws CloneNotSupportedException {Pig pig = (Pig) super.clone();pig.age = (Date) age.clone();return pig;}}
结构型
外观模式
定义: 又叫门面模式,提供了一个统一的接口,用来访问子系统中的一群接口
外观模式定义了一个高层接口,让子系统更容易使用
适用场景: 子系统越来越复杂,增加外观模式提供简单调用接口
构建多层系统结构,利用外观对象作为每层的入口,简化层间调用
优点: 简化了调用过程,无需了解深入子系统,防止带来风险。
减少系统依赖 松散耦合
更好的划分访问层次
符合迪米特法则,即最少知道原则
缺点: 增加子系统,扩展子系统行为容易引入风险
不符合开闭原则
外观模式和中介者模式
外观模式和单例模式
外观模式和抽象工作模式

装饰着模式
定义:在不改变原有对象的基础上,将功能附加到对象上
提供了比继承更有弹性的替代方案(扩展原有对象功能)
适用场景: 扩展一个类的功能或给一个类添加附加职责
动态的给一个对象添加功能,这些功能可以再动态的撤销
优点: 继承的有力补充,比继承灵活,不改变原有对象的情况下给一个对象扩展功能
通过使用不同装饰类以及这些 装饰类的排列组合,可以实现不同的效果。
符合开闭原则
缺点: 会出现更多的代码,更多的类,增加程序复杂性
动态装饰时,多层装饰时会更复杂
装饰着模式和代理模式
装饰者模式和适配器模式

适配器模式
定义: 将一个类的接口转换成客户期望的另一个接口
使原本接口不兼容的类可以一起工作
应用场景: 已经存在的类,它的方法和需求不匹配的(方法结果相同或相似)
不是软件设计阶段考虑的模式,是随着软件维护,由于不同产品,不同厂家造成功能类似而接口不同情况下的解决方案。
优点: 能提高类的透明性和复用,现有的类复用但不需要改变
目标类和适配器类解耦,提高程序扩展性
符合开闭原则
缺点: 适配器编写过程需要全面考虑,可能回增加系统的复杂性
增加系统代码可读的难度
扩展: 对象适配器 类适配器
适配器模式和外观模式
类适配器

public interface Target {void request();
}
public class ConcreteTarget implements Target{@Overridepublic void request() {System.out.println("ConcreteTarget request");}
}
/*** 适配器模式*/
public class Adapter extends Adaptee implements Target {@Overridepublic void request() {super.adapteeRequest();}
}
public class Adaptee {public void adapteeRequest(){System.out.println("被适配者的方法");}
}
对象适配器
/*** 适配器对象模式*/
public class Adapter implements Target{private Adaptee adaptee=new Adaptee();@Overridepublic void request() {adaptee.adapteeRequest();}
}
享元模式
定义: 提供了减少对象数量从而改善应用所需的对象结构的方式
运用共享技术有效地支持大量细粒度的对象
使用场景: 常常应用于系统底层的开发,以便解决系统的性能问题。
系统有大量相似对象 需要缓冲池的场景
优点: 减少对象的创建,降低内存中对象的数量,降低系统的内存,提高效率
减少内存之外的其他资源占用
缺点: 内/外部状态 关注线程安全问题
使系统 程序的逻辑复杂化
扩展: 内部状态 外部状态
享元模式和代理模式
享元模式和单例模式
public interface Employee {void report();
}
public class EmployeeFactory {private static final Map<String, Employee> EMPLOYEE_MAP = new HashMap<String, Employee>();private EmployeeFactory() {}public static Employee getManger(String department) {Manger manger = (Manger) EMPLOYEE_MAP.get(department);if (manger == null) {manger = new Manger(department);System.out.println("创建部门经理:" + department);manger.setReportContent(department + "部门汇报:......");EMPLOYEE_MAP.put(department, manger);}return manger;}}
public class Manger implements Employee{@Overridepublic void report() {System.out.println(reportContent);}private String department;private String reportContent;public Manger(String department) {this.department = department;}public void setReportContent(String reportContent) {this.reportContent = reportContent;}
}
组合模式
定义:将对象组合成树形结构以表示“部分-整体”的层次结构
组合模式使客户端对单个对象和组合对象保持一致的方式处理

适用场景: 希望客户端可以忽略组合对象与单个对象的差异时
处理一个树形结构时
优点: 清楚地定义分层次的复杂对象,表示对象的全部或部分层次
让客户端忽略了层次的差异,方便对整个层次结构进行控制
简化客户端代码
符合开闭原则
缺点: 限制类型时会较为复杂
使设计变得更加抽象
组合模式和访问者模式

桥接模式
定义: 将抽象部分与它的具体实现部分分离,使它们都可以独立地变化
通过组合的方式建立两个类之间联系,而不是继承
适用场景: 抽象和具体实现之间增加更多的灵活性
一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立进行扩展。
不希望适用继承,或因为多层继承导致类的个数剧增
优点:分离抽象部分及其具体实现部分
提高了系统的可扩展性
符合开闭原则
缺点: 增加了系统的理解与设计难度
需要正确地识别出系统中两个独立变化的维度
桥接模式和组合模式
桥接模式和适配器模式

代理模式
定义: 为其他对象提供一种代理,以控制对这个对象的访问
代理对象在客户端和目标对象之间起到中介的作用
优点: 代理模式能将代理对象与真实被调用的目标对象分离
一定程序上降低了系统的耦合度,扩展性好
保护目标对象
增强目标对象
缺点:代理模式会造成系统设计中类的数目增加
在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢
增加系统的复杂度
代理模式和装饰着模式
扩展:
静态代理:
动态代理:
CGLib代理:
相关文章:
设计模式之美
UML建模 统一建模语言(UML)是用来设计软件的可视化建模语言。它的语言特点是简单 统一 图形化 能表达软件设计中的动态与静态信息。 UML的分类 动态结构图: 类图 对象图 组件图 部署图 动态行为图: 状态图 活动图 时序图 协作…...
2025-03-15 学习记录--C/C++-PTA 练习3-4 统计字符
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻 一、题目描述 ⭐️ 练习3-4 统计字符 本题要求编写程序,输入10个字符,统计其中英文字母、空格或回车、…...
802.11标准
系列文章目录 文章目录 系列文章目录一、相关知识二、使用步骤1.802.11修正比较2.802.11ac 三、杂记 一、相关知识 跳频扩频:射频信号可分为窄带信号和扩频信号。如果射频信号的带宽大于承载数据所需的带宽,该信号就属于扩频信号。跳频扩频(FHSS)是一种…...
母婴商城系统Springboot设计与实现
项目概述 《母婴商城系统Springboot》是一款基于Springboot框架开发的母婴类电商平台,旨在为母婴产品提供高效、便捷的在线购物体验。该系统功能全面,涵盖用户管理、商品分类、商品信息、商品资讯等核心模块,适合母婴电商企业或个人开发者快…...
C#通过API接口返回流式响应内容---分块编码方式
1、背景 上一篇文章《C#通过API接口返回流式响应内容—SSE方式》阐述了通过SSE(Server Send Event)方式,由服务器端推送数据到浏览器。本篇是通过分块编码的方式实现 2、效果 3、具体代码 3.1 API端实现 [HttpGet] public async Task Chu…...
游戏引擎学习第158天
回顾和今天的计划 我们在这里会实时编码一个完整的游戏,没有使用引擎或库,一切都由我们自己做所有的编程工作,游戏中的每一部分,无论需要做什么,我们都亲自实现,并展示如何完成这些任务。今天,…...
如何在电脑上使用 Jupyter Notebook 通过 SSH 远程连接树莓派Zero
有无数种方式通过SSH远程连接树莓派,但对于树莓派Zero 2W这种硬件资源有限的板子,因为内存有限Pycharm干脆不能通过SSH连接树莓派Zero 2W。VScode通过SSH连接时,也会因为资源有限时常断线。因此,我们就要用轻量级的编辑器Jupyter …...
[新能源]新能源汽车快充与慢充说明
接口示意图 慢充接口为交流充电口(七孔),快充接口为直流充电口(九孔)。 引脚说明 上图给的是充电口的引脚图,充电枪的为镜像的。 慢充接口引脚说明 快充接口引脚说明 充电流程 慢充示意图 慢充&…...
《解锁华为黑科技:MindSpore+鸿蒙深度集成奥秘》
在数字化浪潮汹涌澎湃的当下,人工智能与操作系统的融合已成为推动科技发展的核心驱动力。华为作为科技领域的先锋,其AI开发框架MindSpore与鸿蒙系统的深度集成备受瞩目,开启了智能生态的新篇章。 华为MindSpore:AI框架的创新先锋…...
HCIA-ACL
一、基本概念 1、概念:ACL即访问控制列表,是一种基于包过滤的访问控制技术。由一条或多条规则组成的集合,通过定义动作来确保哪些数据包可以通过,哪些需要被阻止。 2、基本原理:ACL 通过规则对数据包分类,…...
深入解析 React 最新特性:革新、应用与最佳实践
深入解析 React 最新特性:革新、应用与最佳实践 1. 引言 React 作为前端开发的核心技术之一,近年来不断推出 新的 API 和优化机制,从 Concurrent Rendering(并发模式) 到 Server Components(服务器组件&a…...
通信协议传输过程中的序列化和反序列化机制
在通信协议的传输过程中,序列化和反序列化是核心机制之一。它们影响数据的传输效率、兼容性和解析速度,特别是在分布式系统、RPC(远程过程调用)、消息队列和微服务架构中至关重要。 1. 什么是序列化和反序列化? 序列化…...
在IDEA中连接达梦数据库:详细配置指南
达梦数据库(DM Database)作为国产关系型数据库的代表,广泛应用于企业级系统开发。本文将详细介绍如何在IntelliJ IDEA中配置并连接达梦数据库,助力开发者高效完成数据库开发工作。 准备工作 1. 下载达梦JDBC驱动 访问达梦官方资…...
OkHttp 的证书设置
在 Android 开发中,通过 OkHttp 自定义 SSLSocketFactory 和 X509TrustManager 可以有效增强 HTTPS 通信的安全性,防止中间人攻击(如抓包工具 Charles/Fiddler 的拦截)。以下是实现防抓包的关键技术方案: 一、Okhttp设…...
机器视觉工程师如何学习C#通讯
建议大家可以提前测试,真实模拟现场的情况,或者采用虚拟串口,虚拟网口频繁测试通讯的稳定性,以后有现场需要,可以快速布局到现场。 机器视觉工程师学习C#通讯协议需要结合工业场景需求,掌握基础协议原理、常…...
数字电子技术会被淘汰吗?模拟电子技术的未来发展与应用
引言 当今世界正处在数字电子技术飞速发展的时代。自上世纪中叶以来,集成电路中的晶体管数量按照摩尔定律呈指数级增长,计算设备性能大幅提升。一个典型例子是,我们口袋中的智能手机拥有的运算能力远超早期计算机:iPhone 14的处理…...
基于yolov8+streamlit实现目标检测系统带漂亮登录界面
【项目介绍】 基于YOLOv8和Streamlit实现的目标检测系统,结合了YOLOv8先进的目标检测能力与Streamlit快速构建交互式Web应用的优势,为用户提供了一个功能强大且操作简便的目标检测平台。该系统不仅具备高精度的目标检测功能,还拥有一个漂亮且…...
软件性能测试与功能测试联系和区别
随着软件开发技术的迅猛发展,软件性能测试和功能测试成为了确保软件质量的两个重要环节。那么只有一字之差的性能测试和功能测试分别是什么?又有哪些联系和区别呢? 一、软件性能测试是什么? 软件性能测试是为了评估软件系统在特定条件下的表现,包…...
交易系统【三】网关
第二章本来是要讲消息总线,审核说是过度宣传,就放弃了,不纠结,先跳过。 网关和消息总线的底层技术都和网络相关,两者也有很重要的差别。消息总线主要用于内网,受交换机和网卡影响比较大,网络状…...
Axure设计之堆叠柱状图教程(中继器)
堆叠柱状图是一种常用的数据可视化工具,它通过在同一柱状图内堆叠不同类别的数据,以展示每个类别在总体中的贡献或占比。堆叠柱状图不仅可以帮助我们观察数据的总量,还能清晰地揭示各部分之间的关系和变化趋势。以下是一个使用Axure制作动态效…...
antd的Form表单校验的方式有几种
Ant Design 的 Form 组件提供了多种灵活的表单校验方式,以下是常见的几种方法及示例: 1. 内置校验规则 通过 rules 配置预定义的校验规则(如必填、长度、格式等)。 <Form.Itemname"email"label"邮箱"rul…...
前端面试:React hooks 调用是可以写在 if 语句里面吗?
在 React 中,Hooks 是一种新的特性,允许你在函数组件中使用状态(state)和其他 React 特性。非常重要的一点是,React Hooks 必须遵循特定的规则,以确保组件的行为一致。 React Hooks 使用规则 只能在函数组…...
本地部署Hive集群
规划 服务机器Hive本体部署在Node1元数据服务所需的关系型数据库(MYSQL)部署在Node1 安装MYSQL数据库 # 更新密钥 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022# 安装Mysql yum库 rpm -Uvh http://repo.mysql.com//mysql57-community-release-el7-7.noarch.…...
CNN的激活函数
我们来对比 Sigmoid、Softmax 和 ReLU 这三种激活函数的相同点和不同点,并分别说明它们相较于其他两种激活函数的优点。 相同点 都是非线性激活函数: 这三种激活函数都能为神经网络引入非线性特性,使网络能够学习复杂的模式。 广泛应用于深度…...
【愚公系列】《高效使用DeepSeek》001-什么是DeepSeek
标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…...
零成本本地化搭建开源AI神器LocalAI支持CPU推理运行部署方案
文章目录 前言1. Docker部署2. 简单使用演示3. 安装cpolar内网穿透4. 配置公网地址5. 配置固定公网地址 前言 嘿,小伙伴们!今天给大家带来一个超酷的黑科技——LocalAI。没错,你没听错,就是那个能在你的个人电脑上运行大型语言模…...
Visual Studio Code 基本使用指南
Visual Studio Code(简称 VSCode)是一款由微软开发的免费、开源、跨平台的代码编辑器,凭借其轻量级设计、丰富的插件生态和强大的功能,成为全球开发者的首选工具。本文将从安装配置到核心功能,全面解析 VSCode 的基本使…...
git使用命令总结
文章目录 Git 复制创建提交步骤Git 全局设置:创建 git 仓库:已有仓库? 遇到问题解决办法:问题一先git pull一下,具体流程为以下几步: 详细步骤 Git 复制 git clone -b RobotModelSetting/develop https://gitlab.123/PROJECT/123.git创建提…...
内容中台的核心架构是什么?
模块化架构设计解析 内容中台的模块化架构通过分层解耦实现灵活扩展,其核心由基础资源层、能力服务层与业务应用层构成。基础层以统一数据治理体系为支撑,通过标准化接口实现结构化与非结构化数据的统一存储,例如Baklib采用分布式存储架构保…...
【小白向】Ubuntu|VMware 新建虚拟机后打开 SSH 服务、在主机上安装vscode并连接、配置 git 的 ssh
常常有人问VMware-Tools装了也复制粘贴不了怎么办,这个东西影响因素太多了,具体解决办法你们可以参考一下:【经验】VMware|虚拟机只能使用鼠标无法使用键盘、装不了或装了VMware-Tools无法复制粘贴的可能解决办法_增强型键盘驱动程…...
