java 設計模式之依賴倒置實例詳解
本文實例講述了java 設計模式之依賴倒置。分享給大家供大家參考,具體如下:
依賴倒置的概念我也是在一篇博文上理解的,我覺得很精辟,所以收錄在我的博客中。
類A 依賴 類B,之后根據需求 類A 變換為依賴 類C,這時候我們認為類A 是高層模塊, 類B 和 類C 是低層模塊。
什么是高層模塊?什么是底層模塊?
高層模塊你可以理解為控制層,負責復雜的業(yè)務邏輯。
低層模塊你可以理解為數據層,負責基本的原子操作。
什么意思? 我舉個例子。
比如大胃王比賽。
在這場比賽中的規(guī)則是比賽誰吃饅頭吃的最多。有參賽選手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){} //選手支持吃包子
思路是正確的,但是在實際開發(fā)中,這樣做,可能會給程序帶來不必要的風險。
這時候依賴倒置的優(yōu)越性就體現出來了。
還是思考。既然饅頭吃光了,現在要比賽吃包子,那么我們想一下如果包子也吃光了還沒有分出勝負,要繼續(xù)追加比賽怎么辦?再用重載嗎? 人都是可以吃食物的,我們要讓包子和饅頭都實現食物接口。而參賽選手的依賴應該從包子和饅頭 抽象出來 依賴食物接口。 這樣只要一個類實現了食物接口,那么都能被吃。
/**
* 食物接口
*/
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吃包子
}
}
這樣的設計有助于降低類之間的耦合程度,抽象穩(wěn)定的多,細節(jié)交給實現類。
更多java相關內容感興趣的讀者可查看本站專題:《Java面向對象程序設計入門與進階教程》、《Java數據結構與算法教程》、《Java操作DOM節(jié)點技巧總結》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設計有所幫助。
相關文章
解讀maven項目中Tomcat10與JSTL的問題匯總(Debug親身經歷)
這篇文章主要介紹了解讀maven項目中Tomcat10與JSTL的問題匯總(Debug親身經歷),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07
SpringBoot整合RabbitMQ處理死信隊列和延遲隊列
這篇文章將通過示例為大家詳細介紹SpringBoot整合RabbitMQ時如何處理死信隊列和延遲隊列,文中的示例代碼講解詳細,需要的可以參考一下2022-05-05
基于Spring Security的Oauth2授權實現方法
這篇文章主要介紹了基于Spring Security的Oauth2授權實現方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-09-09
Java中對AtomicInteger和int值在多線程下遞增操作的測試
這篇文章主要介紹了Java中對AtomicInteger和int值在多線程下遞增操作的測試,本文得出AtomicInteger操作 與 int操作的效率大致相差在50-80倍上下的結論,需要的朋友可以參考下2014-09-09

