[设计模式] 浅谈迪米特法则
迪米特法则
原则说明:迪米特法则,也被称为最少知识原则(Least Knowledge Principle),一个对象应该对其他对象有最少的了解。通俗的讲,一个类应该对自己需要耦合或调用的类知道的越少越好。
为什么要遵守该原则
该原则是为了让使系统降低类之间的耦合度,提高模块的相对独立性。
用一个简单的例子说明
假设我们要去逛商场,去店铺里面买东西,通过代码实现:
// 顾客类
public class Customer {
private String name;
public Customer(String name) {
this.name = name;
}
public void shopping(Shop shop) {
System.out.println(name + "开始在商店购物");
shop.sellGoods();
}
}
// 商店类
public class Shop {
private String goods;
public Shop() {
this.goods = "商品";
}
public void sellGoods() {
System.out.println("商店销售" + goods);
}
}
// 主函数
public class Main {
public static void main(String[] args) {
Customer customer = new Customer("张三");
Shop shop = new Shop();
customer.shopping(shop);
}
}
上面的代码错误的让顾客直接与商店交互,而不是通过商场。这样就破坏了迪米特法则。
正确的做法应该是顾客只需要知道商场可以提供商品,而不需要知道商场是如何提供商品的,也不需要知道商场内部的商店是如何销售商品的。
// 顾客类
public class Customer {
private String name;
public Customer(String name) {
this.name = name;
}
public void shopping(ShoppingMall shoppingMall) {
System.out.println(name + "开始在商场购物");
shoppingMall.provideGoods();
}
}
// 商场类
public class ShoppingMall {
private Shop shop;
public ShoppingMall() {
this.shop = new Shop();
}
public void provideGoods() {
shop.sellGoods();
}
}
// 商店类
public class Shop {
private String goods;
public Shop() {
this.goods = "商品";
}
public void sellGoods() {
System.out.println("商店销售" + goods);
}
}
// 主函数
public class Main {
public static void main(String[] args) {
Customer customer = new Customer("张三");
ShoppingMall shoppingMall = new ShoppingMall();
customer.shopping(shoppingMall);
}
}
总结
迪米特法则可以降低类之间的耦合度,提高模块的相对独立性。但是过度使用迪米特法则会使系统产生大量中介类,从而增加系统的复杂度,使得模块之间的通信效率降低。因此,在采用迪米特法则的时候需要反复权衡,在保证高内聚和低耦合的同时,也要保证系统的结构清晰。