设计模式之依赖倒置原则
高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。
抽象不应该依赖于具体实现,具体实现应该依赖于抽象。
依赖倒置原则是程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。
public class HondaCar{ public void Run(){ Console.WriteLine("本田开始启动了"); } public void Turn(){ Console.WriteLine("本田开始转弯了"); } public void Stop(){ Console.WriteLine("本田开始停车了"); } } public class FordCar{ publicvoidRun(){ Console.WriteLine("福特开始启动了"); } publicvoidTurn(){ Console.WriteLine("福特开始转弯了"); } publicvoidStop(){ Console.WriteLine("福特开始停车了"); } } public class AutoSystem{ public enum CarType{ Ford,Honda }; private HondaCar hcar=new HondaCar(); private FordCar fcar=new FordCar(); private CarType type; public AutoSystem(CarType type){ this.type=type; } private void RunCar(){ if(type==CarType.Ford){ fcar.Run(); } else { hcar.Run(); } } private void TurnCar(){ if(type==CarType.Ford){ fcar.Turn(); } else { hcar.Turn(); } } private void StopCar(){ if(type==CarType.Ford){ fcar.Stop(); } else { hcar.Stop(); } } }
上面的程序确实能够实现针对Ford和Honda车的无人驾驶,但是软件是在不断变化的,软件的需求也在不断的变化。这会给系统增加新的相互依赖。随着时间的推移,越来越多的车种必须加入到AutoSystem中,这个“AutoSystem”模块将会被if/else语句弄得很乱,而且依赖于很多的低层模块,只要低层模块发生变动,AutoSystem就必须跟着变动。导致上面所述问题的一个原因是,含有高层策略的模块,如AutoSystem模块,依赖于它所控制的低层的具体细节的模块(如HondaCar()和FordCar())。如果我们能够找到一种方法使AutoSystem模块独立于它所控制的具体细节,那么我们就可以自由地复用它了。我们就可以用这个模块来生成其它的程序,使得系统能够用在需要的汽车上。
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 { publicvoidRun() { Console.WriteLine("福特开始启动了"); } public void Turn() { Console.WriteLine("福特开始转弯了"); } public void Stop() { Console.WriteLine("福特开始停车了"); } } public class HondaCar:ICar { publicvoidRun() { 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; } private void RunCar() { icar.Run(); } private void TurnCar() { icar.Turn(); } private void StopCar() { icar.Stop(); } }
=======================================================================
结束。
原文链接:https://www.f2er.com/javaschema/283671.html