反腐层(Anti-Corruption Layer):一种保护你的系统完整性的设计模式

简介: 反腐层(Anti-Corruption Layer):一种保护你的系统完整性的设计模式

1. 技术诞生的背景

在我们的软件开发生涯中,我们经常会遇到需要与旧的、可能设计不佳或者已经过时的系统进行交互的情况。这些系统可能是由于历史原因或者其他不可避免的因素而存在。在这种情况下,我们需要一种方式来保护我们的新系统不被这些旧系统的设计问题所影响。这就是反腐层(Anti-Corruption Layer,简称ACL)的诞生背景。

反腐层是由Eric Evans在他的《领域驱动设计》一书中首次提出的。这是一种设计模式,它的主要目的是在你的系统和外部系统之间创建一个隔离层,以防止外部系统的设计问题影响到你的系统。

2. 技术使用注意事项

使用反腐层时,有几个关键点需要注意:

  • 明确界定边界:反腐层应该清晰地定义它与外部系统的交互边界。这意味着你需要明确知道哪些操作需要通过反腐层进行,哪些操作可以直接与外部系统交互。
  • 最小化依赖:反腐层应该尽可能地减少对外部系统的依赖。这意味着你应该尽量避免在反腐层中使用外部系统的特性或者功能。
  • 保持独立:反腐层应该尽可能地独立于你的系统和外部系统。这意味着反腐层应该能够独立地进行更改和更新,而不会影响到你的系统或者外部系统。

3. 使用场景

反腐层主要用于以下几种场景:

  • 与旧系统交互:当你的系统需要与设计不佳或者已经过时的系统交互时,可以使用反腐层来保护你的系统不被这些旧系统的设计问题所影响。
  • 系统迁移:当你需要将你的系统从一个平台迁移到另一个平台时,可以使用反腐层来隔离这两个平台之间的差异。
  • 系统集成:当你需要将你的系统与其他系统集成时,可以使用反腐层来保护你的系统不被其他系统的设计问题所影响。

4. 案例

让我们来看一个实际的例子。假设我们有一个电子商务系统,它需要与一个旧的库存管理系统进行交互。这个旧系统的设计并不理想,它的接口复杂且难以理解。如果我们直接使用这个旧系统的接口,那么我们的电子商务系统可能会受到这个旧系统设计问题的影响。

为了解决这个问题,我们可以在电子商务系统和库存管理系统之间创建一个反腐层。这个反腐层将负责与库存管理系统进行交互,并提供一个简单、清晰的接口给电子商务系统使用。

在反腐层中,我们可以将库存管理系统的复杂接口转换为简单的操作,例如“获取库存”、“更新库存”等。这样,电子商务系统就可以通过这些简单的操作与库存管理系统进行交互,而不需要直接处理库存管理系统的复杂接口。

通过使用反腐层,我们可以保护电子商务系统不被库存管理系统的设计问题所影响,同时也可以使电子商务系统更容易理解和维护。

总的来说,反腐层是一种非常有用的设计模式,它可以帮助我们保护我们的系统不被外部系统的设计问题所影响。但是,使用反腐层也需要注意一些问题,例如需要明确界定边界,最小化依赖,以及保持独立。只有这样,我们才能充分利用反腐层带来的好处。

jdk中的案例

在Java的早期版本中,java.util.Enumeration接口被广泛用于遍历集合元素。然而,随着Java的发展,java.util.Iterator接口被引入并取代了Enumeration接口,因为它提供了更丰富的操作,如remove()方法,以及更符合Java集合框架的设计。

然而,有些旧的代码或者库可能仍然使用Enumeration接口。在这种情况下,我们需要一种方式来使新的代码能够与使用Enumeration接口的旧代码进行交互。这就是EnumerationAdapter的诞生背景。

EnumerationAdapter是一种适配器模式的实现,它将Enumeration接口适配为Iterator接口,使得新的代码可以使用Iterator接口来遍历Enumeration接口提供的元素。

/**
 * 1、Iterator 是新版本的迭代器。
 * 2、Enumeration 是旧版本的迭代器。
 * 3、EnumerationAdapter 是适配者(Adapter)角色,相当于Anti-corruption layer 在 Enumeration 和 Iterator 之间做适配
 */
public class EnumerationAdapter implements Iterator {
    private Enumeration enumeration;
    public EnumerationAdapter(Enumeration enumeration) {
        this.enumeration = enumeration;
    }
    @Override
    public boolean hasNext() {
        return enumeration.hasMoreElements();
    }
    @Override
    public Object next() {
        return enumeration.nextElement();
    }
    @Override
    public void remove() {
        throw new UnsupportedOperationException("remove");
    }
}
// main方法
public static void main(String[] args) {
  Vector vector = new Vector();
  vector.add("java");
  vector.add("python");
  vector.add("javaScript");
  Enumeration enumeration = vector.elements();
  Iterator iterator = new EnumerationAdapter(enumeration);
  while (iterator.hasNext()) {
    System.out.println(iterator.next());
  }
}
相关文章
|
2月前
|
设计模式 编译器 API
【C/C++ Pimpl模式】隐藏实现细节的高效方式 (Pimpl Idiom: An Efficient Way to Hide Implementation Details)
【C/C++ Pimpl模式】隐藏实现细节的高效方式 (Pimpl Idiom: An Efficient Way to Hide Implementation Details)
74 1
|
7月前
|
Web App开发 监控 安全
使用注解 @requires 给 SAP CAP CDS 模型添加权限控制
使用注解 @requires 给 SAP CAP CDS 模型添加权限控制
42 0
|
10月前
|
设计模式 Oracle 关系型数据库
深入理解合成复用原则(Composition /Aggregate Reuse Principle)
深入理解合成复用原则(Composition /Aggregate Reuse Principle)
166 0
|
10月前
|
机器人 BI 人工智能
The Blocks Problem(问题的抽象)
The Blocks Problem(问题的抽象)
57 0
The Blocks Problem(问题的抽象)
|
网络协议 物联网 智能硬件
【Matter】解密Matter协议(一)--- 关键概念及特性
本篇文章我们将介绍Matter的关键概念及特性。 Matter是一个基于IPV6的运行在TCP/IP上的应用层协议,Matter的底层可以工作在WiFi、Thread或者以太网协议上,而蓝牙是用来完成Matter的入网配置的。
2034 0
【Matter】解密Matter协议(一)--- 关键概念及特性
|
机器学习/深度学习 算法 算法框架/工具
传输丰富的特征层次结构以实现稳健的视觉跟踪 Transferring Rich Feature Hierarchies for Robust Visual Tracking
传输丰富的特征层次结构以实现稳健的视觉跟踪 Transferring Rich Feature Hierarchies for Robust Visual Tracking
109 2
传输丰富的特征层次结构以实现稳健的视觉跟踪 Transferring Rich Feature Hierarchies for Robust Visual Tracking
|
设计模式 前端开发 Java
微服务设计模式:反腐层(Anti-corruption layer)
微服务设计模式:反腐层(Anti-corruption layer)
524 0
微服务设计模式:反腐层(Anti-corruption layer)
【愚公系列】2021年12月 面向对象设计原则(六)-合成复用原则(Composite Reuse Principle or CRP)
【愚公系列】2021年12月 面向对象设计原则(六)-合成复用原则(Composite Reuse Principle or CRP)
Design layer interface的设计与实现
Design layer interface的设计与实现
Design layer interface的设计与实现