迪米特法则(Law of Demeter,也称为最少知识原则)是一个面向对象编程的原则,它指出一个对象应该对其他对象有最少的了解。这有助于减少类之间的耦合度,使代码更易于维护和理解。
下面是一个简单的例子,其中违反了迪米特法则的代码:
违反迪米特法则的代码示例:
```python
class Order:
def __init__(self, customer_name):
self.customer_name = customer_name
def deliver(self, delivery_person):
delivery_person.deliver_order(self) # 这里直接调用了delivery_person的deliver_order方法
class DeliveryPerson:
def deliver_order(self, order):
print(f"Delivery person is delivering order for {order.customer_name}")
# 这里的实现逻辑需要了解Order的内部状态和具体细节
# 使用代码示例
order = Order("John Doe")
delivery_person = DeliveryPerson()
order.deliver(delivery_person) # 违反迪米特法则,因为Order类直接调用了DeliveryPerson的deliver_order方法
```
在这个例子中,`Order` 类直接调用了 `DeliveryPerson` 类的 `deliver_order` 方法。这违反了迪米特法则,因为 `Order` 类需要知道 `DeliveryPerson` 类的实现细节。这增加了类之间的耦合度,使得代码难以维护和理解。
修复代码以遵守迪米特法则:
```python
class Order:
def __init__(self, customer_name):
self.customer_name = customer_name
self.delivery_service = DeliveryService() # 引入中介者模式,使用DeliveryService作为中介者
def deliver(self):
self.delivery_service.deliver(self) # 将delivery逻辑委托给中介者处理
class DeliveryService: # 这是我们的中介者,处理所有订单的配送逻辑,不与特定的Order或DeliveryPerson耦合。
def deliver(self, order):
delivery_person = DeliveryPerson() # 这里我们注入了一个新的delivery person,这样Order和DeliveryPerson解耦了。
delivery_person.deliver_order(order) # 通过中介者进行沟通,实现了解耦。
print("Order delivery process completed.") # 中介者负责确保整个流程完成。
return order.customer_name # 可以根据业务需求返回相关信息等。
class DeliveryPerson:
def deliver_order(self, order): # 这个方法只需要处理和订单相关的具体配送操作,无需知道订单的具体内容。这样与Order的耦合度就降低了。
print(f"Delivery person is delivering order for {order.customer_name}") # 执行具体的配送操作。
```
在这个修复后的代码中,我们引入了中介者模式(`DeliveryService`)。通过将 `Order` 和 `DeliveryPerson` 之间的直接通信改为通过 `DeliveryService` 进行通信,我们降低了类之间的耦合度,并遵循了迪米特法则。