迪米特法则又叫作最少知道原则,一般设计用于 对类内部 进行 合适的封装。
下面举例: 人关闭电脑的 示例
1.1没有实现 迪米特原则的 代码
namespace 迪米特
{
internal class Program
{
static void Main(string[] args)
{
}
}
public class ComputerShutDown
{
public void CloseProgram()
{
Console.WriteLine("关闭程序");
}
public void CloseDisplay()
{
Console.WriteLine("关闭显示器");
}
public void ClosePower()
{
Console.WriteLine("关闭电源");
}
}
public class Person
{
public void CloseComputer(ComputerShutDown computerShutDown)
{
computerShutDown.CloseProgram();
computerShutDown.CloseDisplay();
computerShutDown.ClosePower();
}
}
}
1.2 分析 以上代码,首先 Peson类 需要调用 ComputerShutDown类的方法进行关机。问题产出一:如果上面的 ComputerShutDown类 是一个别人写的模块,并且有几十种 方法,而且关机 业务顺序 不能 随便填写,必须 安装 规则一步一步才能 正常关机,比如 必须先关程序,在关显示器,在关电源,这种规则 才能 正常关机。如果 你拿到这块代码是 别人写的模块,你如果不知道顺序,并且方法很多,可能就会无法下手 编写代码。问题产出二:如果这个 关机的业务 顺序 发生 改变,作为 Peson类 编写者,还需要在更改 源代码,并且需要分析 逻辑,很是麻烦。
解决方法 就是利用 迪米特原则进行 封装。
在ComputerShutDown类中 提供一个直接 关机 的方法,此方法 由编写ComputerShutDown类的人进行封装,对外提供,其他方法 封闭。
解决代码 如下:
namespace 迪米特
{
internal class Program
{
static void Main(string[] args)
{
}
}
public class ComputerShutDown
{
private void CloseProgram()
{
Console.WriteLine("关闭程序");
}
private void CloseDisplay()
{
Console.WriteLine("关闭显示器");
}
private void ClosePower()
{
Console.WriteLine("关闭电源");
}
//对外 提供 关机方法
public void CloseComputer()
{
this.CloseProgram();
this.CloseDisplay();
this.ClosePower();
}
}
public class Person
{
public void CloseComputer(ComputerShutDown computerShutDown)
{
computerShutDown.CloseComputer();
}
}
}