依赖倒置原则(Dependence Inversion Principle)
依赖倒置原则(Dependence Inversion Principle)是程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。面向对象的开发很好的解决了这个问题,一般情况下抽象的变化概率很小,让用户程序依赖于抽象,实现的细节也依赖于抽象。即使实现细节不断变动,只要抽象不变,客户程序就不需要变化。这大大降低了客户程序与实现细节的耦合度。
例如,
1)一般的反面设计实现
using System;
namespace ConsoleApplication
{
public class HondaCar
{
public void Run()
{
Console.WriteLine("本田开始启动");
}
public void Turn()
{
Console.WriteLine("本田开始转弯");
}
public void Stop()
{
Console.WriteLine("本田开始停车");
}
}
public class FordCar
{
public void Run()
{
Console.WriteLine("福特开始启动");
}
public void Turn()
{
Console.WriteLine("福特开始转弯");
}
public void Stop()
{
Console.WriteLine("福特开始停车");
}
}
public class BmwCar
{
public void Run()
{
Console.WriteLine("福特开始启动");
}
public void Turn()
{
Console.WriteLine("福特开始转弯");
}
public void Stop()
{
Console.WriteLine("福特开始停车");
}
}
public class AutoSystem
{
public enum CarType
{
Ford, Honda, Bmw
};
HondaCar hcar = new HondaCar();
FordCar fcar = new FordCar();
BmwCar bcar = new BmwCar();
private CarType type;
public AutoSystem(CarType type)
{
this.type = type;
}
public void RunCar()
{
if (type == CarType.Ford)
{
fcar.Run();
}
else if (type == CarType.Honda)
{
hcar.Run();
}
else if (type == CarType.Bmw)
{
bcar.Run();
}
}
public void TurnCar()
{
if (type == CarType.Ford)
{
fcar.Turn();
}
else if (type == CarType.Honda)
{
hcar.Turn();
}
else if (type == CarType.Bmw)
{
bcar.Turn();
}
}
public void StopCar()
{
if (type == CarType.Ford)
{
fcar.Stop();
}
else if (type == CarType.Honda)
{
hcar.Stop();
}
else if (type == CarType.Bmw)
{
bcar.Stop();
}
}
}
class Program
{
public static void Main()
{
AutoSystem autoSystem = new AutoSystem(AutoSystem.CarType.Honda);
autoSystem.RunCar();
autoSystem.TurnCar();
autoSystem.StopCar();
Console.ReadKey();
}
}
}
2)依赖倒置原则的实现
using System;
namespace ConsoleApplication
{
public interface ICar
{
void Run();
void Turn();
void Stop();
}
public class BmwCar : ICar
{
public void Run()
{
Console.WriteLine("宝马开始启动");
}
public void Turn()
{
Console.WriteLine("宝马开始转弯");
}
public void Stop()
{
Console.WriteLine("宝马开始停车");
}
}
public class FordCar : ICar
{
public void Run()
{
Console.WriteLine("福特开始启动");
}
public void Turn()
{
Console.WriteLine("福特开始转弯");
}
public void Stop()
{
Console.WriteLine("福特开始停车");
}
}
public class HondaCar : ICar
{
public void Run()
{
Console.WriteLine("本田开始启动");
}
public void Turn()
{
Console.WriteLine("本田开始转弯");
}
public void Stop()
{
Console.WriteLine("本田开始停车");
}
}
public class AutoSystem
{
private ICar icar;
public AutoSystem(ICar icar)
{
this.icar = icar;
}
public void RunCar()
{
icar.Run();
}
public void TurnCar()
{
icar.Turn();
}
public void StopCar()
{
icar.Stop();
}
}
class Program
{
public static void Main()
{
AutoSystem autoSystem = new AutoSystem(new HondaCar());
autoSystem.RunCar();
autoSystem.TurnCar();
autoSystem.StopCar();
Console.ReadKey();
}
}
}