[设计模式]设计模式之依赖倒置原则

Sep 4, 2016


高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。

抽象不应该依赖于具体实现,具体实现应该依赖于抽象。

依赖倒置原则是程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。

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();  
    }  
}