圖二
看圖 2中這個簡單的類圖。這兒有一個“AutoSystem”類,它包含一個“ICar”接口。這個“AutoSystem”類根本不依賴於“FordCar”和“HondaCar”。所以,依賴關系被“倒置”了:“AutoSystem”模塊依賴於抽象,那些具體的汽車操作也依賴於相同的抽象。
於是可以添加ICar

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();
}
}
現在AutoSystem系統依賴於ICar 這個抽象,而與具體的實現細節HondaCar、FordCar、BmwCar無關,所以實現細節的變化不會影響AutoSystem。對於實現細節只要實現ICar 即可,即實現細節依賴於ICar 抽象。
綜上:
一個應用中的重要策略決定及業務模型正是在這些高層的模塊中。也正是這些模型包含着應用的特性。但是,當這些模塊依賴於低層模塊時,低層模塊的修改將會直接影響到它們,迫使它們也去改變。這種境況是荒謬的。應該是處於高層的模塊去迫使那些低層的模塊發生改變。應該是處於高層的模塊優先於低層的模塊。無論如何高層的模塊也不應依賴於低層的模塊。而且,我們想能夠復用的是高層的模塊。通過
子程序庫的形式,我們已經可以很好地復用低層的模塊了。當高層的模塊依賴於低層的模塊時,這些高層模塊就很難在不同的環境中復用。但是,當那些高層
模塊獨立於低層模塊時,它們就能很簡單地被復用了。這正是位於框架設計的最核心之處的原則。
總結:依賴倒置原則
A.高層次的模塊不應該依賴於低層次的模塊,他們都應該依賴於抽象。
B.抽象不應該依賴於具體,具體應該依賴於抽象。
https://baike.sogou.com/v123729.htm?fromTitle=設計模式