什么是依赖类?松耦合与紧耦合相关困惑求解
嘿,别着急,我来帮你把「依赖类」这个概念和它跟松/紧耦合的关系讲清楚!
先搞懂:什么是依赖类?
简单来说,**依赖类(dependent class)**就是一个必须借助另一个类(我们通常叫它「被依赖类/服务类」)的功能,才能完成自身职责的类。打个生活化的比方:如果你是个做咖啡的店员(依赖类),你必须用咖啡机(被依赖类)才能做出咖啡——没有咖啡机,你就干不了活,这就是依赖关系。
结合松/紧耦合看依赖类的不同表现
光说定义太干,咱们用代码例子对比着看,你一下子就能明白。
例子1:紧耦合下的依赖类
这种情况里,依赖类直接绑定了具体的被依赖类,完全没得选:
// 被依赖类:一款具体的基础咖啡机 class BasicCoffeeMaker { public void brewCoffee() { System.out.println("用基础咖啡机煮出普通咖啡"); } } // 依赖类:咖啡店,它必须用BasicCoffeeMaker才能做咖啡 class CoffeeShop { private BasicCoffeeMaker coffeeMaker; public CoffeeShop() { // 直接在内部创建了BasicCoffeeMaker的实例——这就是紧耦合! this.coffeeMaker = new BasicCoffeeMaker(); } public void serveCustomer() { coffeeMaker.brewCoffee(); System.out.println("咖啡做好啦,请慢用~"); } }
这里的CoffeeShop就是依赖类,它和BasicCoffeeMaker绑定得死死的:如果以后老板想换高端咖啡机,你必须修改CoffeeShop的构造方法,把内部创建的对象换成新的咖啡机类——这就是紧耦合的痛点:依赖类的改动成本极高。
例子2:松耦合下的依赖类
松耦合的关键是让依赖类只依赖抽象的接口/父类,而不是具体的实现:
// 先定义一个抽象的咖啡机接口(相当于「咖啡机的标准」) interface CoffeeMaker { void brewCoffee(); } // 具体实现1:基础咖啡机 class BasicCoffeeMaker implements CoffeeMaker { @Override public void brewCoffee() { System.out.println("用基础咖啡机煮出普通咖啡"); } } // 具体实现2:高端咖啡机 class PremiumCoffeeMaker implements CoffeeMaker { @Override public void brewCoffee() { System.out.println("用高端咖啡机煮出精品手冲咖啡"); } } // 依赖类:咖啡店,现在它只依赖抽象的CoffeeMaker接口 class CoffeeShop { private CoffeeMaker coffeeMaker; // 通过构造方法传入依赖,而不是自己创建——这就是依赖注入 public CoffeeShop(CoffeeMaker coffeeMaker) { this.coffeeMaker = coffeeMaker; } public void serveCustomer() { coffeeMaker.brewCoffee(); System.out.println("咖啡做好啦,请慢用~"); } } // 用的时候随便换咖啡机,CoffeeShop完全不用改! public class Main { public static void main(String[] args) { CoffeeShop basicShop = new CoffeeShop(new BasicCoffeeMaker()); basicShop.serveCustomer(); CoffeeShop premiumShop = new CoffeeShop(new PremiumCoffeeMaker()); premiumShop.serveCustomer(); } }
这里的CoffeeShop依然是依赖类,但它现在只关心“这个东西能煮咖啡”(符合CoffeeMaker接口),不管它是基础款还是高端款。想换咖啡机?直接传个新的实现类就行,CoffeeShop的代码一行都不用改——这就是松耦合的优势:灵活、易维护。
一句话总结
依赖类就是“需要别人帮忙才能干活”的类;紧耦合是依赖类绑定死了具体的帮手,松耦合是依赖类只绑定帮手的“能力标准”,不关心具体是谁。
内容的提问来源于stack exchange,提问作者AndyE
相关产品推荐
相关产品推荐

