java 設(shè)計模式之依賴倒置實例詳解
本文實例講述了java 設(shè)計模式之依賴倒置。分享給大家供大家參考,具體如下:
依賴倒置的概念我也是在一篇博文上理解的,我覺得很精辟,所以收錄在我的博客中。
類A 依賴 類B,之后根據(jù)需求 類A 變換為依賴 類C,這時候我們認為類A 是高層模塊, 類B 和 類C 是低層模塊。
什么是高層模塊?什么是底層模塊?
高層模塊你可以理解為控制層,負責(zé)復(fù)雜的業(yè)務(wù)邏輯。
低層模塊你可以理解為數(shù)據(jù)層,負責(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)在要比賽吃包子,那么我們想一下如果包子也吃光了還沒有分出勝負,要繼續(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)定的多,細節(jié)交給實現(xiàn)類。
更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java面向?qū)ο蟪绦蛟O(shè)計入門與進階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設(shè)計有所幫助。
相關(guān)文章
解讀maven項目中Tomcat10與JSTL的問題匯總(Debug親身經(jīng)歷)
這篇文章主要介紹了解讀maven項目中Tomcat10與JSTL的問題匯總(Debug親身經(jīng)歷),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07SpringBoot整合RabbitMQ處理死信隊列和延遲隊列
這篇文章將通過示例為大家詳細介紹SpringBoot整合RabbitMQ時如何處理死信隊列和延遲隊列,文中的示例代碼講解詳細,需要的可以參考一下2022-05-05基于Spring Security的Oauth2授權(quán)實現(xiàn)方法
這篇文章主要介紹了基于Spring Security的Oauth2授權(quán)實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09SpringBoot2 Jpa 批量刪除功能的實現(xiàn)
這篇文章主要介紹了SpringBoot2 Jpa 批量刪除功能的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01Java數(shù)組模擬優(yōu)先級隊列數(shù)據(jù)結(jié)構(gòu)的實例
這篇文章主要介紹了Java數(shù)組模擬優(yōu)先級隊列數(shù)據(jù)結(jié)構(gòu)的實例,優(yōu)先級隊列中的元素會被設(shè)置優(yōu)先權(quán),本文的例子借助了Java中的TreeSet和TreeMap,需要的朋友可以參考下2016-04-04Java中對AtomicInteger和int值在多線程下遞增操作的測試
這篇文章主要介紹了Java中對AtomicInteger和int值在多線程下遞增操作的測試,本文得出AtomicInteger操作 與 int操作的效率大致相差在50-80倍上下的結(jié)論,需要的朋友可以參考下2014-09-09