溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java設計模式之依賴倒置的示例分析

發布時間:2021-07-15 11:30:43 來源:億速云 閱讀:127 作者:小新 欄目:編程語言

這篇文章將為大家詳細講解有關java設計模式之依賴倒置的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

具體如下:

依賴倒置的概念我也是在一篇博文上理解的,我覺得很精辟,所以收錄在我的博客中。

類A 依賴 類B,之后根據需求 類A 變換為依賴 類C,這時候我們認為類A 是高層模塊, 類B 和 類C 是低層模塊。

什么是高層模塊?什么是底層模塊?
高層模塊你可以理解為控制層,負責復雜的業務邏輯。
低層模塊你可以理解為數據層,負責基本的原子操作。

什么意思? 我舉個例子。
比如大胃王比賽。
在這場比賽中的規則是比賽誰吃饅頭吃的最多。有參賽選手Q和W

/**
 * 饅頭 實體類
 */
class SteamedBuns
{
  private String name = "饅頭"; 
  public String getName()
  {
    return this.name;
  }
}
class Player
{
  //得了多少分
  private int intgral;
  private Sting name;
  public Player(String name)
  {
    setName(name);
  }    
  public void setName(String name)
  {
    this.name = name;
  }
  public String getName()
  {
    return name;
  }
  public void setIntgral(int intgral)
  {
    this.intgral= intgral;
  }
  public int getIntgral()
  {
    return this.intgral;
  }
  public void eat(SteamedBuns steamedBuns)
  {
    System.out.println("我開吃了");
    setIntgral(getIntgral() + 1);
  }
}
public class Main
{
  pubic static void main(String[] agrs)
  {
    Player q = new Player("Q");//選手Q
    Player w = new Player("W");//選手W
    q.eat(new SteamedBuns());//選手Q吃饅頭
    w.eat(new SteamedBuns());//選手W吃饅頭
  }
}

那么,之后問題來了。Q和W 比分一樣,胃口太大把饅頭吃光了,現在好追加比賽吃包子。 但Q和W 的實體只支持吃饅頭,這個不符合情理哇,不可能一個人能吃饅頭不能吃包子哇。

public void eat(SteamedBuns steamedBuns)//選手只支持吃饅頭

有的同學可能會想到用重載這個方法。

public void eat(SteamedBuns steamedBuns){}   //選手支持吃饅頭
public void eat(SteamedStuffedBun steamedStuffedBun){} //選手支持吃包子

思路是正確的,但是在實際開發中,這樣做,可能會給程序帶來不必要的風險。
這時候依賴倒置的優越性就體現出來了。
還是思考。既然饅頭吃光了,現在要比賽吃包子,那么我們想一下如果包子也吃光了還沒有分出勝負,要繼續追加比賽怎么辦?再用重載嗎? 人都是可以吃食物的,我們要讓包子和饅頭都實現食物接口。而參賽選手的依賴應該從包子和饅頭 抽象出來 依賴食物接口。 這樣只要一個類實現了食物接口,那么都能被吃。

/**
 * 食物接口
 */
interface Food
{
  public String getName();
}
/**
 * 饅頭 實體類
 */
class SteamedBuns implements Food
{
  private String name = "饅頭";
  @Override
  public String getName()
  {
    return this.name;
  }
}
/**
 * 包子 實體類
 */
class SteamedStuffedBun implements Food
{
  private String name = "包子";
  @Override
  public String getName()
  {
    return this.name;
  }
}
class Player
{
  private int intgral;
  private Sting name;
  public Player(String name)
  {
    setName(name);
  }  
  public void setName(String name)
  {
    this.name = name;
  }
  public String getName()
  {
    return name;
  }
  public void setIntgral(int intgral)
  {
    this.intgral= intgral;
  }
  public int getIntgral()
  {
    return this.intgral;
  }
  /**取消對具體食物種類的依賴
  public void eat(SteamedBuns steamedBuns)
  {
    System.out.println("我開吃了");
    setIntgral(getIntgral() + 1);
  }
  */
  public void eat(Food food)
  {
    System.out.println("我開吃了");
    setIntgral(getIntgral() + 1);
  }
}
public class Main
{
  pubic static void main(String[] agrs)
  {
    Player q = new Player("Q");//選手Q
    Player w = new Player("W");//選手W
    q.eat(new SteamedBuns());//選手Q吃饅頭
    w.eat(new SteamedBuns());//選手W吃饅頭
    q.eat(new SteamedStuffedBun());//選手Q吃包子
    w.eat(new SteamedStuffedBun());//選手W吃包子
  }
}

這樣的設計有助于降低類之間的耦合程度,抽象穩定的多,細節交給實現類。

關于“java設計模式之依賴倒置的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女