设计模式之结构型模式
这些模式关注对象之间的组合和关联方式,以便形成更大的结构和功能。
- 适配器模式(Adapter Pattern)
- 桥接模式(Bridge)
- 装饰器模式(Decorator)
- 组合模式(Composite)
- 外观模式(Facade)
- 享元模式(Flyweight)
- 代理模式(Proxy)
适配器模式(Adapter Pattern)
将一个类的接口转换成客户端所期望的另一个接口。
 这种模式通常用于解决两个不兼容接口之间的兼容性问题。(充电线的转接头的功能)
一个生活中的实例是使用适配器模式连接不同类型的电源插头和电源插座。假设你有一个美国制造的电器,它使用美国标准的两脚插头(Type A),而你的墙上只有中国标准的三脚插座(Type I)。为了让电器能够在中国使用,你需要一个适配器来连接两者。
 以下是一个简单的代码示例,展示了如何使用适配器模式来连接不同类型的插头和插座:
# 目标接口
class SocketAdapter:def __init__(self, plug):self.plug = plugdef connect(self):pass# 中国标准插座
class ChinaSocket:def connect_china_socket(self):print("连接中国标准插座")# 美国标准插头
class USPlug:def connect_us_plug(self):print("连接美国标准插头")# 适配器类
class ChinaToUSAdapter(SocketAdapter):def connect(self):self.plug.connect_china_socket()# 客户端代码
if __name__ == "__main__":china_socket = ChinaSocket()adapter = ChinaToUSAdapter(china_socket)adapter.connect()
在上述代码中,我们定义了一个目标接口 SocketAdapter,它声明了一个 connect 方法。然后,我们有一个中国标准插座类 ChinaSocket,它具有一个 connect_china_socket 方法,用于连接中国标准插座。
接下来,我们有一个美国标准插头类 USPlug,它具有一个 connect_us_plug 方法,用于连接美国标准插头。
然后,我们创建了一个适配器类 ChinaToUSAdapter,它继承了目标接口 SocketAdapter。适配器类内部持有一个中国标准插座对象 china_socket,并实现了目标接口的 connect 方法,该方法通过适配器调用中国标准插座的连接方法。
最后,我们在客户端代码中创建了中国标准插座对象 china_socket,并将其传递给适配器类的构造函数创建适配器对象 adapter。然后,我们调用适配器对象的 connect 方法,它会通过适配器调用中国标准插座的连接方法。
通过适配器模式,我们可以使用适配器对象连接不同类型的插头和插座,使得它们能够兼容并正常工作。这样,我们就实现了不同类型的插头和插座之间的兼容性。
桥接模式(Bridge)
把抽象化与实现化解耦
# 桥接模式的实现# 实现部分的接口
class DrawingAPI:def draw_circle(self, x, y, radius):pass# 具体实现部分A
class DrawingAPIA(DrawingAPI):def draw_circle(self, x, y, radius):print(f"在坐标({x}, {y})处以半径{radius}绘制圆形(使用实现A)")# 具体实现部分B
class DrawingAPIB(DrawingAPI):def draw_circle(self, x, y, radius):print(f"在坐标({x}, {y})处以半径{radius}绘制圆形(使用实现B)")# 抽象部分
class Shape:def __init__(self, drawing_api):self.drawing_api = drawing_apidef draw(self):pass# 具体抽象部分1
class CircleShape(Shape):def __init__(self, x, y, radius, drawing_api):super().__init__(drawing_api)self.x = xself.y = yself.radius = radiusdef draw(self):self.drawing_api.draw_circle(self.x, self.y, self.radius)# 具体抽象部分2
class SquareShape(Shape):def __init__(self, x, y, side_length, drawing_api):super().__init__(drawing_api)self.x = xself.y = yself.side_length = side_lengthdef draw(self):self.drawing_api.draw_square(self.x, self.y, self.side_length)# 客户端代码
if __name__ == "__main__":circle_a = CircleShape(1, 2, 3, DrawingAPIA())circle_a.draw()circle_b = CircleShape(4, 5, 6, DrawingAPIB())circle_b.draw()
在这个示例中,我们使用了桥接模式来将抽象部分(Shape)和实现部分(DrawingAPI)解耦。抽象部分定义了基本的形状(如圆形和正方形),而实现部分定义了具体的绘制方法。
 通过将抽象部分和实现部分组合在一起,我们可以轻松地在运行时选择不同的实现,而无需更改抽象部分的代码。这样可以实现更灵活和可扩展的代码结构。
 在上述示例中,我们创建了两个具体的实现部分:DrawingAPIA 和 DrawingAPIB,它们分别用于绘制圆形。然后,我们创建了两个具体的抽象部分:CircleShape,分别使用不同的实现部分进行绘制。
如果不使用桥接模式进行解耦,代码可能会变得更加紧密耦合,具体实现部分将直接嵌入到抽象部分中。以下是一个示例,展示了没有使用桥接模式的情况:
# 没有使用桥接模式的紧密耦合示例# 圆形类
class CircleShape:def __init__(self, x, y, radius):self.x = xself.y = yself.radius = radiusdef draw(self):# 在这里直接实现绘制圆形的逻辑print(f"在坐标({self.x}, {self.y})处以半径{self.radius}绘制圆形")# 正方形类
class SquareShape:def __init__(self, x, y, side_length):self.x = xself.y = yself.side_length = side_lengthdef draw(self):# 在这里直接实现绘制正方形的逻辑print(f"在坐标({self.x}, {self.y})处以边长{self.side_length}绘制正方形")# 客户端代码
if __name__ == "__main__":circle = CircleShape(1, 2, 3)circle.draw()square = SquareShape(4, 5, 6)square.draw()
在这个紧密耦合的示例中,绘制逻辑直接嵌入到了具体的抽象部分类中。这导致了以下问题:
- 如果需要修改绘制逻辑,例如更改绘制圆形的方式,就需要直接修改 CircleShape类的代码,而不是通过更改实现部分来实现。
- 添加新的形状类,例如三角形,需要在每个具体形状类中重复实现绘制逻辑,造成代码重复。
因此,使用桥接模式可以将抽象部分和实现部分解耦,提高代码的灵活性和可扩展性。它允许我们在运行时选择不同的实现部分,而无需修改抽象部分的代码。
装饰器模式(Decorator)
在不修改原始对象的情况下动态地添加额外的功能。
 装饰器模式通过将对象包装在一个具有相同接口的装饰器对象中来实现。
装饰器模式由以下几个关键角色组成:
- 抽象组件(Component):定义了被装饰对象和装饰器对象的公共接口。
- 具体组件(ConcreteComponent):实现了抽象组件接口,并定义了需要被装饰的对象。
- 抽象装饰器(Decorator):继承或实现了抽象组件接口,并持有一个对抽象组件的引用。它的主要目的是为了扩展或修改抽象组件的行为。
- 具体装饰器(ConcreteDecorator):实现了抽象装饰器接口,并扩展了抽象组件的行为。具体装饰器可以在调用被装饰对象的方法之前或之后添加额外的逻辑。
# 抽象组件
class Component:def operation(self):pass# 具体组件
class ConcreteComponent(Component):def operation(self):print("执行具体组件操作")# 抽象装饰器
class Decorator(Component):def __init__(self, component):self.component = componentdef operation(self):self.component.operation()# 具体装饰器
class ConcreteDecorator(Decorator):def operation(self):super().operation()self.additional_operation()def additional_operation(self):print("执行额外的操作")# 客户端代码
if __name__ == "__main__":# 创建具体组件component = ConcreteComponent()# 创建具体装饰器,并将具体组件作为参数传递decorator = ConcreteDecorator(component)# 执行操作decorator.operation()
在上述示例中,Component 是抽象组件,ConcreteComponent 是具体组件。Decorator 是抽象装饰器,ConcreteDecorator 是具体装饰器。客户端代码创建了一个具体组件对象,并将其作为参数传递给具体装饰器对象。装饰器对象在调用具体组件对象的方法之前或之后添加了额外的操作。
装饰器模式的优点是可以动态地添加功能,而不需要修改原始对象的代码。它提供了一种灵活的方式来扩展对象的行为,同时遵循开闭原则。然而,装饰器模式可能会导致类的数量增加,并且在多层装饰的情况下可能会变得复杂。因此,在使用时需要权衡利弊,并根据具体需求进行设计和实现。
组合模式(Composite)
将对象组合成树形结构以表示“部分-整体”的层次结构。
 组合模式使得用户可以统一对待单个对象和组合对象,从而简化了代码的使用和维护。
组合模式由以下几个关键角色组成:
- 组件(Component):定义组合中对象的通用接口,可以是抽象类或接口。该接口声明了操作方法,例如添加、删除、获取子组件等。
- 叶子节点(Leaf):表示组合中的叶子对象,它没有子组件。实现组件接口的具体类。
- 组合节点(Composite):表示组合中的容器对象,它可以包含子组件。实现组件接口的具体类,并包含一个集合来存储子组件。
- 客户端(Client):通过组件接口操作组合对象。
# 组件接口
class Component:def add(self, component):passdef remove(self, component):passdef get_child(self, index):passdef operation(self):pass# 叶子节点
class Leaf(Component):def operation(self):print("执行叶子节点操作")# 组合节点
class Composite(Component):def __init__(self):self.children = []def add(self, component):self.children.append(component)def remove(self, component):self.children.remove(component)def get_child(self, index):return self.children[index]def operation(self):print("执行组合节点操作")for child in self.children:child.operation()# 客户端代码
if __name__ == "__main__":# 创建叶子节点leaf1 = Leaf()leaf2 = Leaf()# 创建组合节点,并添加叶子节点composite1 = Composite()composite1.add(leaf1)composite1.add(leaf2)# 创建叶子节点leaf3 = Leaf()# 创建组合节点,并添加叶子节点和组合节点composite2 = Composite()composite2.add(leaf3)composite2.add(composite1)# 执行操作composite2.operation()
在上述示例中,Component 是组件接口,Leaf 是叶子节点类,Composite 是组合节点类。客户端代码创建了一棵树形结构,包含了叶子节点和组合节点,并通过调用 operation() 方法执行操作。组合节点会递归调用其子组件的操作方法,从而实现整个树形结构的操作。
组合模式的优点是简化了代码的使用和维护,使得客户端可以统一对待单个对象和组合对象。它也提供了灵活性和可扩展性,因为可以轻松地添加新的叶子节点或组合节点。然而,组合模式可能会增加系统的复杂性,并且在某些情况下可能会导致性能问题,因此在使用时需要权衡利弊。
外观模式(Facade)
提供了一个统一的接口,用于访问子系统中的一组接口。
 外观模式隐藏了子系统的复杂性,为客户端提供了一个简单的接口来与子系统进行交互。
下面是一个外观模式的示例代码:
# 子系统类A
class SubsystemA:def operation_a(self):print("执行子系统A的操作")# 子系统类B
class SubsystemB:def operation_b(self):print("执行子系统B的操作")# 子系统类C
class SubsystemC:def operation_c(self):print("执行子系统C的操作")# 外观类
class Facade:def __init__(self):self.subsystem_a = SubsystemA()self.subsystem_b = SubsystemB()self.subsystem_c = SubsystemC()def operation(self):self.subsystem_a.operation_a()self.subsystem_b.operation_b()self.subsystem_c.operation_c()# 客户端代码
facade = Facade()
facade.operation()
在上述代码中,有三个子系统类 SubsystemA、SubsystemB 和 SubsystemC,它们分别提供了各自的操作。外观类 Facade 将这些子系统进行了封装,并提供了一个统一的接口 operation()。
在客户端代码中,我们创建了一个外观对象 facade,然后通过调用 facade.operation() 来访问子系统的操作。在内部,外观对象会依次调用子系统类的相应方法,隐藏了子系统的复杂性。
当我们执行 facade.operation() 时,会依次输出:
执行子系统A的操作
执行子系统B的操作
执行子系统C的操作
这样,客户端就可以通过简单的接口来访问子系统的功能,而不需要了解和处理子系统的复杂逻辑。外观模式帮助简化了系统的使用和维护。
享元模式(Flyweight)
通过共享对象来减少内存使用和提高性能。
 享元模式适用于存在大量相似对象的场景,通过共享这些对象的内部状态,来减少对象的数量。
下面是一个在模具设计中使用享元模式的示例代码:
# 模具接口
class Mold:def __init__(self, mold_type):self.mold_type = mold_typedef produce(self, product):print(f"生产 {product} 使用 {self.mold_type} 模具")# 享元工厂类
class MoldFactory:def __init__(self):self.molds = {}def get_mold(self, mold_type):if mold_type not in self.molds:self.molds[mold_type] = Mold(mold_type)return self.molds[mold_type]# 客户端代码
mold_factory = MoldFactory()# 第一批产品使用 A 类型模具
mold_a = mold_factory.get_mold("A")
mold_a.produce("产品1")
mold_a.produce("产品2")# 第二批产品使用 B 类型模具
mold_b = mold_factory.get_mold("B")
mold_b.produce("产品3")
mold_b.produce("产品4")# 第三批产品继续使用 A 类型模具
mold_a.produce("产品5")
mold_a.produce("产品6")
在上述代码中,Mold 类表示模具,每个模具有一个类型(mold_type)属性,并且可以生产产品。MoldFactory 类是享元工厂类,用于创建和管理模具对象。
在客户端代码中,我们通过 MoldFactory 获取模具对象。如果请求的模具对象已经存在于享元工厂中,则直接返回该对象;否则,创建一个新的模具对象并添加到享元工厂中。这样,相同类型的模具对象会被共享使用。
在示例中,我们先获取了一个类型为 “A” 的模具对象,并使用它生产了两个产品。然后,我们获取了一个类型为 “B” 的模具对象,并使用它生产了两个产品。最后,我们又使用之前获取的 “A” 类型模具对象生产了两个产品。
运行上述代码,会输出以下结果:
生产 产品1 使用 A 模具
生产 产品2 使用 A 模具
生产 产品3 使用 B 模具
生产 产品4 使用 B 模具
生产 产品5 使用 A 模具
生产 产品6 使用 A 模具
可以看到,尽管我们只创建了两个不同类型的模具对象,但通过共享对象的方式,成功地减少了模具对象的数量。享元模式帮助我们节省了内存开销,并提高了系统的性能。
代理模式(Proxy)
它提供了一个代理对象,控制对另一个对象的访问。
 通过使用代理对象,可以在访问对象时添加额外的逻辑,例如权限控制、缓存、延迟加载等。
下面是一个代理模式的示例代码:
# 主题接口
class Subject:def request(self):pass# 真实主题类
class RealSubject(Subject):def request(self):print("处理真实请求")# 代理类
class Proxy(Subject):def __init__(self, real_subject):self.real_subject = real_subjectdef request(self):# 在访问真实主题前添加额外的逻辑self.pre_request()# 调用真实主题的请求方法self.real_subject.request()# 在访问真实主题后添加额外的逻辑self.post_request()def pre_request(self):print("代理对象处理请求前的操作")def post_request(self):print("代理对象处理请求后的操作")# 客户端代码
real_subject = RealSubject()
proxy = Proxy(real_subject)# 通过代理对象访问真实主题
proxy.request()
在上述代码中,有一个主题接口 Subject,其中定义了一个 request() 方法。RealSubject 类是真实主题类,实现了主题接口,并提供了具体的请求处理逻辑。
Proxy 类是代理类,也实现了主题接口,并持有一个真实主题对象。在代理类的 request() 方法中,可以在调用真实主题对象的请求方法前后添加额外的逻辑。在示例中,我们在访问真实主题前后分别输出了一些操作。
在客户端代码中,我们创建了一个真实主题对象 real_subject,然后将其传递给代理对象 proxy 的构造函数。通过代理对象 proxy,我们可以访问真实主题的请求方法。
当执行 proxy.request() 时,会依次输出:
代理对象处理请求前的操作
处理真实请求
代理对象处理请求后的操作
可以看到,代理对象在访问真实主题前后添加了额外的操作。代理模式帮助我们控制对真实主题的访问,并可以在访问前后进行一些附加处理。这样,我们可以在不修改真实主题代码的情况下,对其进行扩展和增强。
相关文章:
设计模式之结构型模式
这些模式关注对象之间的组合和关联方式,以便形成更大的结构和功能。 适配器模式(Adapter Pattern)桥接模式(Bridge)装饰器模式(Decorator)组合模式(Composite)外观模式&a…...
centOs 6.10 编译 qt 5.15.11
安装依赖库 xcb 依赖库 qt xcb 需要的依赖 如何要用 x11, 就要在编译的时候加上 -xcb 选项,就要安装 xcb 相关的库。 到时可以在 config.log 文件查看,缺少哪个库就安装哪个。 下面是我手动安装的库和对应版本: xcb-proto-1.14.tar.gz x…...
 
Redis对象的数据结构及其原理汇总
本文首发于公众号:Hunter后端 原文链接:Redis对象的数据结构及其底层实现原理汇总 当我们被问到 Redis 中有什么数据结构,或者说数据类型,我们可能会说有字符串、列表、哈希、集合、有序集合。 其实这几种数据类型在 Redis 中都由…...
@RestController 注解网页返回 [] ,出现的bug
RestController 注解网页返回 [] ,出现的bug RestController RequestMapping("emp") public class EmployeeController {Autowiredprivate EmployeeService employeeService;GetMapping("find")public List<Employee> find(){List<Employee> …...
 
C语言指针详解(1)(能看懂字就能明白系列)文章超长,慢慢品尝
目录 1、内存和地址 2、指针简介 与指针相关的运算符: 取地址操作符(&) 解引用操作符(间接操作符)(*) 编辑 指针变量的声明 指针变量类型的意义 指针的基本操作 1、指针与整数相加…...
 
为什么别人年薪30W+?同样为测试人,“我“的测试之路...
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、软件测试员&am…...
 
【Unity】XML文件的解析和生成
目录 使用XPath路径语法解析 使用xml语法解析 XML文件的生成 XML文件是一种常用的数据交换格式,它以文本形式存储数据,并使用标签来描述数据。解析和生成XML文件是软件开发中常见的任务。 解析XML文件是指从XML文件中读取数据的过程。在.NET中&#…...
 
Vue h5页面手指滑动图片
场景: 四张图,要求随着手指滑动而滑动 代码: imgs是父盒子 poster-item是每个图片 .imgs {white-space: nowrap;overflow: hidden;overflow-x: auto;margin-bottom: 17px;.poster-item {display: inline-block;vertical-align: middle;wid…...
Python类属性下划线的意义
在Python中,类属性(class attribute)前面带有下划线的命名约定有一些特殊的含义,但它并不会影响属性的实际行为。这是一种命名约定,用于指示属性的用途和访问级别。以下是一些常见的下划线命名约定: 1. 单…...
DbUtils概述
概述 JDBC实用工具组件 Commons DbUtils库是一个小的类集,旨在使使用JDBC更容易。JDBC资源清理代码是平凡的,容易出错的工作,所以这些类从代码中抽象出所有的清理任务,留给你真正想用JDBC做的事情:查询和更新数据。 …...
 
大数据基础设施搭建 - Hadoop
文章目录 一、下载安装包二、上传压缩包三、解压压缩包四、配置环境变量五、测试Hadoop5.1 测试hadoop命令5.2 测试wordcount案例5.2.1 创建wordcount输入文本信息5.2.2 执行程序5.2.3 查看结果 六、分发压缩包到集群中其他机器6.1 分发压缩包6.2 解压压缩包6.3 配置环境变量 七…...
 
测试开发环境下centos7.9下安装docker的minio
按照以下方法进行 1、安装docker,要是生产等还是要按照docker-ce yum install docker 2、启动docker service docker start 3、 查看docker信息 docker info 4、加到启动里 systemctl enable docker.service 5、开始docker pull minio/minio 但报错&#x…...
Django之模版层
目录 一、常用语法 二、模版语法之变量 三、模板之过滤器(Filters) 【1】default 【2】length 【3】filesizeformat 【4】slice 【5】date 【6】safe 【7】truncatechars 【8】其它过滤器(了解) 四、模版之标签 【1】for标签 【2】if 标签…...
 
spark性能调优 | 内存优化
目录 我们先了解一下有哪些内存温馨提示RDD示范(spark版本2.1.1)RDD进行优化Df和Ds进行示范 我们先了解一下有哪些内存 1.storage内存 存储数据,缓存 可预估2.shuffle内存 计算join groupby 不可预估spark1.6之前 静态管理的,spark1.6之…...
【PG】PostgreSQL高可用之自动故障转移-repmgrd
前言 上面的几篇文章介绍了repmgr的部署,手动进行 从节点提升,主从切换,孤立从从节点找到新的主库等操作,但是都是需要通过手动去执行命令。大家都知道,在线上生产环境中数据库每秒钟的不可用都会造成严重的事故&am…...
 
操作系统OS/存储管理/内存管理/内存管理的主要功能_基本原理_要求
基本概念 内存管理的主要功能/基本原理/要求 **内存管理的主要功能: ** 内存空间的分配与回收。由操作系统完成主存储器空间的分配和管理,使程序员摆脱存储分配的麻烦,提高编程效率。地址转换。在多道程序环境下,程序中的逻辑地…...
【手写数据库toadb】SQL解析器的实现架构,create table/insert 多values语句的解析树生成流程和输出结构分析
SQL解析器架构和实现 专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定期更新,对应的代码也会定期更新,每个阶段的代码会打上tag,方…...
 
设计模式-备忘录模式-笔记
动机(Motivation) 在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯到对象之前处于某个点时的状态。如果使用一些公有接口来让其他对象得到对象的状态,便会暴露对象的细节…...
 
机器学习—基本术语
目录 1.样本(示例) 2.属性 3.属性值 4.属性空间 5.样本空间 6.学习(训练) 7.数据集 8.测试 9.假设 10.学习器 11.标记 12.样例 13.标记空间(样例空间) 14.分类与回归 15.有监督学习、无监督…...
 
pytorch单精度、半精度、混合精度、单卡、多卡(DP / DDP)、FSDP、DeepSpeed模型训练
pytorch单精度、半精度、混合精度、单卡、多卡(DP / DDP)、FSDP、DeepSpeed(环境没搞起来)模型训练代码,并对比不同方法的训练速度以及GPU内存的使用 代码:pytorch_model_train FairScale(你真…...
 
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
 
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
 
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
 
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
 
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
