摘要:什么是依賴,什么是耦合現在來聊一聊我對于依賴和耦合的理解。現在又有一個需求小明想要去吃香蕉,想要去吃梨子。再加一個這個需求是一個合理的需求,但是因為我們這一段的代碼是不合理的,產生了依賴和耦合。
我剛開始學習軟件工程,學習設計模式,總是會聊到設計模式,總是會說高內聚,低耦合,還有依賴注入。什么是依賴,什么是耦合?現在來聊一聊我對于依賴和耦合的理解。
先看下面一段簡單代碼,
class Apple{ private String name = "Apple"; } class People{ private Liststomach = new ArrayList<>(); public void eat(Apple apple){ stomach.add(apple); } } class MainDemo { public static void main(String[] args) { People xiaoming= new People(); Apple apple = new Apple(); xiaoming.eat(apple); } }
一個人類,一個蘋果類,代碼的意思是小明吃蘋果,保存在胃中。
現在又有一個需求:小明想要去吃香蕉,想要去吃梨子。用上面這一段的代碼就不好改了。要完成需求就需要做大量的變化。再加一個 Banana stomach?
這個需求是一個合理的需求,但是因為我們這一段的代碼是不合理的,產生了依賴和耦合。
如何減少依賴,就是使用面向接口的編程。依賴一個抽象而不是依賴一個實現。
interface Food{ } class Banana implement Food{ private String name = "Banana"; } class Apple implement Food{ private String name = "Apple"; } class People{ private Liststomach = new ArrayList<>(); public void eat(Food food){ stomach.add(food); } } class MainDemo { public static void main(String[] args) { People xiaoming= new People(); Food apple = new Apple(); xiaoming.eat(apple); Food banana = new Banana(); xiaoming.eat(banana); } }
這樣其實我的接口里面啥也沒有,但是卻將依賴轉移到了抽象的接口。這樣我每次添加都可以增加不同水果。其實我這個取名是Food,那么這個其實可以添加其他的種類食物。這也體現了開放-閉合原則。再看最后一個例子
import java.util.*; interface Food{ public String getName(); } abstract class Fruit implements Food { protected String type = "fruit"; public abstract void fruitProperty(); } class Banana extends Fruit { private String name = "Banana"; public String getName(){ return name; } public void fruitProperty(){} } class Apple extends Fruit { private String name = "Apple"; public String getName(){ return name; } public void fruitProperty(){} } abstract class Meat implements Food { protected String type = "meat"; public abstract void meatProperty(); } class Beef extends Meat { private String name = "Beef"; public String getName(){ return name; } public void meatProperty(){} } class Chicken extends Meat { private String name = "Chicken"; public String getName(){ return name; }; public void meatProperty(){} } class People{ private Liststomach = new ArrayList<>(); public void eat(Food food){ stomach.add(food); } public void display(){ for (Food f : stomach) { System.out.println("stomach have " + f.getName()); } } } class MainDemo { public static void main(String[] args) { People xiaoming= new People(); Food apple = new Apple(); xiaoming.eat(apple); Food banana = new Banana(); xiaoming.eat(banana); Food beef = new Beef (); xiaoming.eat(beef); Food chicken = new Chicken (); xiaoming.eat(chicken); xiaoming.display(); } }
可以添加任何食物,西瓜,白菜,西蘭花。并且他們之間的方法可以是共有的,也可以私有的。當出現幾種大類相同的事務,添加一個蔬菜抽象類,這樣簡化代碼。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/75022.html
摘要:組件可以處理其他組件的實例化為了避免破壞封裝,請注意通過傳遞的內容。因此,將狀態管理的父組件實例傳遞給子組件會破壞封裝。讓我們改進兩個組件的結構和屬性,以便恢復封裝。組件的可重用性和可測試性顯著增加。 翻譯:劉小夕原文鏈接:https://dmitripavlutin.com/7-... 原文的篇幅非常長,不過內容太過于吸引我,還是忍不住要翻譯出來。此篇文章對編寫可重用和可維護的Re...
摘要:常用的六大設計模式有單一職責原則,里氏替換原則,依賴倒轉原則,接口隔離原則,迪米特法則,開閉原則。這六大原則是最虛,最抽象的,很難理解。這就是接口隔離原則。當我們遵循前面介紹的五大原則,以及使用種設計模式的目的就是遵循開閉原則。 設計模式的目的是為了更好的代碼重用性,可讀性,可靠性和可維護性。常用的六大設計模式有:單一職責原則(SRP),里氏替換原則(LSP),依賴倒轉原則(DIP...
摘要:前言本章我們要講解的是五大原則語言實現的第篇,依賴倒置原則。當應用依賴倒置原則的時候,關系就反過來了。在當靜態類型語言的上下文里討論依賴倒置原則的時候,耦合的概念包括語義和物理兩種。依賴倒置原則和依賴注入都是關注依賴,并且都是用于反轉。 前言 本章我們要講解的是S.O.L.I.D五大原則JavaScript語言實現的第5篇,依賴倒置原則LSP(The Dependency Invers...
摘要:設計方案的容易改變這就是所謂的軟件構建的可維護性,可擴展性和靈活性。這也可能表明類型或方法可能難以維護。基于源代碼中不同運算符和操作數的數量的合成度量。對修改的封閉這種模塊的源代碼是不可侵犯的。 大綱 軟件維護和演變可維護性度量模塊化設計和模塊化原則OO設計原則:SOLIDOO設計原則:GRASP總結 軟件維護和演變 什么是軟件維護? 軟件工程中的軟件維護是交付后修改軟件產品以糾正故障...
摘要:對象之間耦合度過高的系統,必然會出現牽一發而動全身的情形。控制被反轉之后,獲得依賴對象的過程由自身管理變為了由容器主動注入。于是,他給控制反轉取了一個更合適的名字叫做依賴注入。 Spring還可以這么學--IoC(控制反轉) / DI(依賴注入)理解 聲明:文章的前三部分參考博文:https://www.cnblogs.com/Nouno...這篇文章首發是在我的個人微信訂閱號每天學編...
閱讀 1132·2021-10-09 09:43
閱讀 18634·2021-09-22 15:52
閱讀 1076·2019-08-30 15:44
閱讀 3068·2019-08-30 15:44
閱讀 3259·2019-08-26 14:07
閱讀 919·2019-08-26 13:55
閱讀 2581·2019-08-26 13:41
閱讀 3101·2019-08-26 13:29