抽象不應該依賴於具體,具體應該依賴於抽象。 要針對接口編程,而不是針對實現編程。


 

圖二
看圖 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=設計模式

抽象不應該依賴於細節,細節應當依賴於抽象。

要針對接口編程,而不是針對實現編程。

傳遞參數,或者在組合聚合關系中,盡量引用層次高的類。

主要是在構造對象時可以動態的創建各種具體對象,當然如果一些具體類比較穩定,就不必在弄一個抽象類做它的父類,這樣有畫蛇添足的感覺。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM