设计模式之依赖倒置原则

设计模式之依赖倒置原则

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


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

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


=======================================================================

结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值