java 設(shè)計模式之依賴倒置實例詳解
本文實例講述了java 設(shè)計模式之依賴倒置。分享給大家供大家參考,具體如下:
依賴倒置的概念我也是在一篇博文上理解的,我覺得很精辟,所以收錄在我的博客中。
類A 依賴 類B,之后根據(jù)需求 類A 變換為依賴 類C,這時候我們認(rèn)為類A 是高層模塊, 類B 和 類C 是低層模塊。
什么是高層模塊?什么是底層模塊?
高層模塊你可以理解為控制層,負(fù)責(zé)復(fù)雜的業(yè)務(wù)邏輯。
低層模塊你可以理解為數(shù)據(jù)層,負(fù)責(zé)基本的原子操作。
什么意思? 我舉個例子。
比如大胃王比賽。
在這場比賽中的規(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 比分一樣,胃口太大把饅頭吃光了,現(xiàn)在好追加比賽吃包子。 但Q和W 的實體只支持吃饅頭,這個不符合情理哇,不可能一個人能吃饅頭不能吃包子哇。
public void eat(SteamedBuns steamedBuns)//選手只支持吃饅頭
有的同學(xué)可能會想到用重載這個方法。
public void eat(SteamedBuns steamedBuns){} //選手支持吃饅頭
public void eat(SteamedStuffedBun steamedStuffedBun){} //選手支持吃包子
思路是正確的,但是在實際開發(fā)中,這樣做,可能會給程序帶來不必要的風(fēng)險。
這時候依賴倒置的優(yōu)越性就體現(xiàn)出來了。
還是思考。既然饅頭吃光了,現(xiàn)在要比賽吃包子,那么我們想一下如果包子也吃光了還沒有分出勝負(fù),要繼續(xù)追加比賽怎么辦?再用重載嗎? 人都是可以吃食物的,我們要讓包子和饅頭都實現(xiàn)食物接口。而參賽選手的依賴應(yīng)該從包子和饅頭 抽象出來 依賴食物接口。 這樣只要一個類實現(xiàn)了食物接口,那么都能被吃。
/**
* 食物接口
*/
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吃包子
}
}
這樣的設(shè)計有助于降低類之間的耦合程度,抽象穩(wěn)定的多,細(xì)節(jié)交給實現(xiàn)類。
更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java面向?qū)ο蟪绦蛟O(shè)計入門與進(jìn)階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設(shè)計有所幫助。
相關(guān)文章
springboot全局字符編碼設(shè)置方式(解決亂碼問題)
這篇文章主要介紹了springboot全局字符編碼設(shè)置方式(解決亂碼問題),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
關(guān)于Java如何正確地實現(xiàn)方法重載詳解
在一個類中,可以定義多個構(gòu)造方法,這叫做方法的重載!但是關(guān)于方法重載,具有有哪些要求和細(xì)節(jié)?在今天的這篇文章中,小編給大家詳細(xì)說說方法重載相關(guān)的內(nèi)容,需要的朋友可以參考下2023-05-05
如何解決 Java 中的 IndexOutOfBoundsException 異
當(dāng)我們在 Java 中使用 List 的時候,有時候會出現(xiàn)向 List 中不存在的位置設(shè)置新元素的情況,從而導(dǎo)致 IndexOutOfBoundsException 異常,本文將會介紹這個問題的產(chǎn)生原因以及解決方案2023-10-10
Java SimpleDateFormat線程安全問題原理詳解
這篇文章主要介紹了Java SimpleDateFormat線程安全問題原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-05-05
java抓取網(wǎng)頁數(shù)據(jù)獲取網(wǎng)頁中所有的鏈接實例分享
java抓取網(wǎng)頁數(shù)據(jù)獲取網(wǎng)頁中所有的鏈接實例分享,使用方法,只要實例化HtmlParser時傳入網(wǎng)頁地址就可以了2013-12-12
SpringBoot實現(xiàn)OneDrive文件上傳的詳細(xì)步驟
這篇文章主要介紹了SpringBoot實現(xiàn)OneDrive文件上傳的詳細(xì)步驟,文中通過代碼示例和圖文講解的非常詳細(xì),對大家實現(xiàn)OneDrive文件上傳有一定的幫助,需要的朋友可以參考下2024-02-02

