防腐层模式
防腐层模式
防腐层概述
防腐层(Anti-Corruption Layer,ACL)是领域驱动设计中的一种模式,用于在新旧系统之间建立一个隔离层。防腐层的核心职责是:将外部系统的模型和协议转换为内部系统的模型和协议,保护内部系统不受外部系统设计缺陷的"腐蚀"。
防腐层特别适用于以下场景:与遗留系统集成(旧系统的设计可能不合理)、与第三方系统集成(无法控制外部系统的设计变更)、系统重构过程中的新旧系统对接。通过防腐层,内部系统可以保持清晰的领域模型,不受外部系统的影响。
class LegacyOrderSystem:
"""遗留订单系统 - 使用旧的数据格式"""
def get_order(self, order_id: str) -> dict:
# 返回旧格式的数据
return {
"ord_no": order_id,
"cust_id": "C001",
"ord_dt": "2024-01-15",
"ord_amt": "150.00",
"ord_sts": "A" # A=Active, C=Cancelled, F=Fulfilled
}
class ModernOrderSystem:
"""现代订单系统 - 使用新的领域模型"""
def __init__(self):
self.orders = {}
class Order:
def __init__(self, id: str, customer_id: str,
created_at: datetime, amount: Decimal,
status: OrderStatus):
self.id = id
self.customer_id = customer_id
self.created_at = created_at
self.amount = amount
self.status = status
class OrderAntiCorruptionLayer:
"""订单防腐层 - 负责模型转换"""
def __init__(self, legacy_system: LegacyOrderSystem):
self.legacy = legacy_system
def get_order(self, order_id: str) -> Order:
"""从遗留系统获取订单并转换为现代模型"""
legacy_data = self.legacy.get_order(order_id)
return self.translate(legacy_data)
def translate(self, legacy_data: dict) -> Order:
"""将遗留系统数据转换为现代领域模型"""
status_map = {
"A": OrderStatus.ACTIVE,
"C": OrderStatus.CANCELLED,
"F": OrderStatus.FULFILLED
}
return Order(
id=legacy_data["ord_no"],
customer_id=legacy_data["cust_id"],
created_at=datetime.strptime(legacy_data["ord_dt"], "%Y-%m-%d"),
amount=Decimal(legacy_data["ord_amt"]),
status=status_map.get(legacy_data["ord_sts"], OrderStatus.UNKNOWN)
)
防腐层的实现
防腐层的实现方式取决于集成的场景和需求。常见的实现方式包括:适配器模式(将外部接口转换为内部接口)、外观模式(为复杂子系统提供简单接口)、转换器(负责数据格式转换)。
防腐层应该保持轻量,只负责模型和协议的转换,不包含业务逻辑。如果防腐层变得过于复杂,可能说明新旧系统的差异过大,需要考虑更彻底的重构策略。
class AntiCorruptionLayer:
"""通用防腐层框架"""
def __init__(self):
self.translators = {}
self.adapters = {}
def register_translator(self, source_type: str,
target_type: str, translator: callable):
"""注册模型转换器"""
self.translators[(source_type, target_type)] = translator
def register_adapter(self, source_interface: str,
target_interface: str, adapter: callable):
"""注册接口适配器"""
self.adapters[(source_interface, target_interface)] = adapter
def translate(self, source_type: str, target_type: str, data):
"""执行模型转换"""
translator = self.translators.get((source_type, target_type))
if not translator:
raise ValueError(f"未找到转换器: {source_type} -> {target_type}")
return translator(data)
def adapt(self, source_interface: str, target_interface: str, *args, **kwargs):
"""执行接口适配"""
adapter = self.adapters.get((source_interface, target_interface))
if not adapter:
raise ValueError(f"未找到适配器: {source_interface} -> {target_interface}")
return adapter(*args, **kwargs)
# 使用示例
acl = AntiCorruptionLayer()
acl.register_translator("legacy_order", "modern_order", translate_order)
acl.register_adapter("legacy_api", "modern_api", adapt_api_call)
防腐层的设计原则
设计防腐层时应遵循以下原则:职责单一(只负责转换,不包含业务逻辑)、接口清晰(明确输入输出的契约)、错误处理完善(转换失败时提供有意义的错误信息)、性能高效(避免引入明显的性能瓶颈)。
防腐层不是永久的解决方案。当遗留系统被完全替代或外部系统的接口稳定后,防腐层可以逐步移除。但在移除之前,应该确保内部系统不再依赖防腐层的转换逻辑。