参照例Ch1_1,思考如下代码实现依赖反转。 A a=new C(); a.fun();
时间: 2024-09-15 13:14:01 浏览: 25
在传统的面向对象编程中,如你所描述的代码片段,A 类直接创建了 C 类的实例并调用了其 fun() 方法,这种设计被称为"硬编码"依赖。这可能导致代码难以维护和扩展,因为如果 C 类发生变化,A 类也需要相应修改。
为了实现依赖反转(Dependency Injection,简称 DI),我们可以将创建对象和服务提供者解耦。一种常见的做法是采用构造函数注入或 setter 注入。例如,在 Dependency Injection 框架的支持下,可以这样做:
```java
// 使用依赖注入框架(如 Spring 或 Dagger)
class A {
private C c;
public A(C c) { // 构造函数注入
this.c = c;
}
public void fun() {
c.fun();
}
}
// 创建 C 的实例不再由 A 类控制
C cInstance = new C();
A a = new A(cInstance); // 现在 A 接受外部提供的 C 实例
```
通过这种方式,我们把对 C 对象的依赖从 A 类移到了外部,使得 A 类更易于测试和复用,同时也提高了系统的灵活性。
相关问题
参照例Ch1_1,思考如下代码使用接口实现依赖反转。 A a=new C(); a.fun();
在软件设计原则中,依赖反转(Dependency Inversion Principle,DIP)提倡高内聚、低耦合的原则,避免直接依赖,而是通过接口和抽象来控制组件之间的交互。假设我们有 Ch1_1 中类似的一个例子:
```java
// 原来的代码 - 高耦合
interface IFun {
void fun();
}
class A {
private IFun funImpl; // 对IFun的具体实现有硬编码依赖
public A(IFun impl) {
this.funImpl = impl;
}
public void useFun() {
funImpl.fun();
}
}
class B implements IFun { // 具体实现
@Override
public void fun() {
System.out.println("B's implementation");
}
}
class C implements IFun { // 另一具体实现
@Override
public void fun() {
System.out.println("C's implementation");
}
}
public class Main {
public static void main(String[] args) {
A a = new A(new C()); // 高耦合,因为创建了A时就确定了使用的fun实现是C
a.useFun();
}
}
```
为了应用依赖反转,我们可以修改代码如下:
```java
// 使用接口和构造函数传递实现 - 依赖倒置
interface IFun {
void fun();
}
class Client { // 客户端不再持有具体的实现
private A a;
public Client(A a) {
this.a = a;
}
public void callFun(IFun fun) {
a.useFun(fun); // 由外部传入的fun决定使用哪个实现
}
}
class A {
private IFun funImpl;
public A(IFun impl) {
this.funImpl = impl;
}
public void useFun(IFun fun) {
fun.fun();
}
}
// 创建时不再指定具体实现
public class Main {
public static void main(String[] args) {
IFun c = new C();
Client client = new Client(new A(c)); // 现在在创建A时不确定使用哪个实现
client.callFun(c);
}
}
```
select_ch = args.select_ch解释这行代码
这行代码是将变量args中的select_ch属性赋值给变量select_ch。具体来说,args是一个对象或者字典,其中包含了一个名为select_ch的属性,而这行代码的作用就是将这个属性的值赋给变量select_ch。