依赖倒置原则(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(); } } }