跳至主要內容
Active Object

目的

活动对象设计模式使每个驻留在其控制线程中的对象的方法执行与方法调用脱钩。 目的是通过使用异步方法调用和用于处理请求的调度程序来引入并发。

解释

实现活动对象模式的类将包含自同步机制,而无需使用“同步”方法。

真实世界例子

兽人以其野性和顽强的灵魂而著称。 似乎他们有基于先前行为的控制线程。

要实现具有自己的控制机制线程并仅公开其API而不公开自己的执行,我们可以使用活动对象模式。

程序示例


iluwatar大约 1 分钟ConcurrencyPerformance
Caching

目的

为了避免昂贵的资源重新获取,方法是在资源使用后不立即释放资源。资源保留其身份,保留在某些快速访问的存储中,并被重新使用,以避免再次获取它们。

类图

Caching

适用性

在以下情况下使用缓存模式

  • 重复获取,初始化和释放同一资源会导致不必要的性能开销。

鸣谢


iluwatar小于 1 分钟BehavioralPerformanceCloud distributed
Circuit Breaker

意图

以这样一种方式处理昂贵的远程服务调用,即单个服务/组件的故障不会导致整个应用程序宕机,我们可以尽快重新连接到服务。

解释

真实世界例子

想象一个 Web 应用程序,它同时具有用于获取数据的本地文件/图像和远程服务。 这些远程服务有时可能健康且响应迅速,或者由于各种原因可能在某 个时间点变得缓慢和无响应。因此,如果其中一个远程服务缓慢或未成功响应,我们的应用程序将尝试使用多个线程/进程从远程服务获取响应,很快它们都会挂起(也称为 [线程饥饿]thread starvation)导致我们的整个 Web 应用程序崩溃。我们应该能够检测到这种情况并向用户显示适当的消息,以便他/她可以探索不受远程服务故障影响的应用程序的其他部分。 同时,其他正常工作的服务应保持正常运行,不受此故障的影响。


iluwatar大约 6 分钟BehavioralPerformanceDecouplingCloud distributed
Data Transfer Object

目的

次将具有多个属性的数据从客户端传递到服务器,以避免多次调用远程服务器。

解释

真实世界例子

我们需要从远程数据库中获取有关客户的信息。 我们不使用一次查询一个属性,而是使用DTO一次传送所有相关属性。

通俗的说

使用DTO,可以通过单个后端查询获取相关信息。

维基百科说

在编程领域,数据传输对象(DTO)是在进程之间承载数据的对象。 使用它的动机是,通常依靠远程接口(例如Web服务)来完成进程之间的通信,在这种情况下,每个调用都是昂贵的操作。

因为每个(方法)调用的大部分成本与客户端和服务器之间的往返时间有关,所以减少调用数量的一种方法是使用一个对象(DTO)来聚合将要在多次调用间传输的数据,但仅由一个调用提供。


iluwatar大约 2 分钟ArchitecturalPerformance
Dirty Flag

或称

  • 是否脏 模式

目的

避免昂贵资源的重新获取。资源保留其身份,保留在某些快速访问的存储中,并被重新使用以避免再次获取它们。

类图

Dirty Flag

适用性

在以下情况下使用脏标志模式

  • 重复获取,初始化,释放相同资源所导致不必要的性能开销

鸣谢


iluwatar小于 1 分钟BehavioralGame programmingPerformance
Double Checked Locking

含义

通过先测试锁定标准("锁提示")而不实际获取锁的方式来减少获取锁的开销。只有当锁定标准检查表明需要锁定时,才进行实际的锁定逻辑。

类图

Double Checked Locking

适用场景

在以下场景适合使用双重锁检查模式:

  • 在创建对象时有存在并发的访问。如单例模式中,你想创建同一个类的单个实例,如果存在两个或更多的线程对实例进行判空,仅仅检查该该实例是否为空可能是不够的。
  • 在一个方法上存在并发访问,该方法的行为是根据一些约束条件而改变,而这些约束条件在该方法中也会发生变化。

iluwatar小于 1 分钟IdiomPerformance
Monitor

或称

监控对象模式

目的

主要目的是为多个线程或进程提供一种结构化和受控的方式来安全地访问和操作共享资源,例如变量、数据结构或代码的关键部分,而不会导致冲突或竞争条件。

解释

通俗的说

监视器模式用于强制对数据进行单线程访问。 一次只允许一个线程在监视器对象内执行代码。

维基百科说

在并发编程(也称为并行编程)中,监视器是一种同步构造,它允许线程具有互斥性和等待(阻止)特定条件变为假的能力。 监视器还具有向其他线程发出信号通知其条件已满足的机制。


iluwatar大约 4 分钟ConcurrencyPerformance
Sharding

含义

分片模式是指将数据存储划分为水平分区或分片。每个分片都有相同的模式,但持有自己独特的数据子集。

一个分片本身就是一个数据存储(它可以包含许多不同类型的实体的数据),运行在作为存储节点的服务器上。

类图

Sharding pattern class diagram

适用场景

这种设计模式提供了一下的好处:

  • 你可以通过增加在额外的存储节点上,运行的更多分片来实现系统扩容。
  • 系统可以使用现成的廉价硬件,而不是为每个存储节点使用专门(或者昂贵)的服务器硬件。
  • 你可以通过平衡各分片之间的工作负载来减少竞争,以提高性能。
  • 在云环境中,分片可以在物理上靠近访问该节点数据的用户。

iluwatar小于 1 分钟BehavioralPerformanceCloud distributed
Trampoline

目的

蹦床模式是用于在 Java 中递归地实现算法,而不会破坏堆栈,并且可以交错地执行函数,而无需将它们编码在一起。

解释

递归是一种常用的技术,用于以分而治之的方式解决算法问题。例如,计算斐波那契累加和与阶乘。在这类问题中,递归比循环更简单直接。此外,递归可能需要更少的代
码并且看起来更简明。有一种说法是,每个递归问题都可以使用循环来解决,但代价是编写更难以理解的代码。然而,递归型解决方案有一个很大的警告。对于每个
递归调用,通常需要存储一个中间值,并且可用的栈内存有限。栈内存不足会导致栈溢出错误并停止程序执行。蹦床模式是一种允许在 Java 中定义递归算法而无需破坏
堆栈的技巧。


iluwatar大约 3 分钟BehavioralPerformance
Unit Of Work

又被称为

工作单元

目的

当一个业务事务完成时,所有的更新都作为一个大的工作单元一次性发送,以最小化数据库的往返次数进行持久化。

解释

现实世界例子

武器商人拥有一个包含武器信息的数据库。
全城的商贩们都在不断地更新这些信息,这导致数据库服务器的负载很高。
为了使负载更易于管理,我们应用了工作单元模式,将许多小的更新批量发送。

用直白的话来说

工作单元将许多小的数据库更新合并成一个批次。
以优化往返次数。


iluwatar大约 3 分钟ArchitecturalData accessPerformance