gpt4 book ai didi

java - 使用不相关类的相关类的有效设计

转载 作者:行者123 更新时间:2023-11-30 07:59:47 24 4
gpt4 key购买 nike

我有以下情况,想知道设计解决方案的最佳方法

public abstract class A {
public abstract A getHelper();
public abstract void launchHandle();
public static A initHelper(String condition) throws Exception {
if ( condition == 'xyz') {
return C.getHelper();
} else {
return B.getHelper();
}
}
}

public class B extends A {
protected static A b;

@Override
public A getHelper() {
b = new B();
return b;
}

@Override
public void launchHandle() {
System.out.println("Launching Handle");
}

public String getName() {
return "I am from Class B";
}
}

public class C extends A {
protected static A c;

@Override
public A getHelper() {
c = new C();
return c;
}

@Override
public void launchHandle() {
System.out.println("Launching Handle from C");
}

public String getValue() {
return "I am from Class C";
}
}

**Executor class**

public class Executor {

public static void main(String[] args) {
A aa = a.initHelper(condition);
}
}

现在在上述方法中,我无法访问 B 类的 aa.getName() 或 C 类的 aa.getValue() 之类的方法,这是有道理的。但是如何在执行器类中获取这些方法呢? Executor 对 B 类和 C 类一无所知,也不应该知道。 Executor 只知道 A 类,但想访问从 A 类扩展而来的 B 和 C 的子类方法。

请帮助设计此问题以及解决此问题的最佳方法。

提前致谢。

最佳答案

Executor is only aware of Class A, but want to access methods SubClass methods from B & C which are extended from Class A.

如果仔细查看代码,您会注意到所有类中唯一的契约常量是 launchHandle 方法(除了 getHelper initHelper 仅用于实例化正确的子类)。 BC 之间没有真正的关系,只是它们的实例化是由 A 控制的。

这就是我考虑解决问题的方式:

执行器工厂

Executor 成为一个 abstract 类,而不是让它成为你程序的入口点:

public abstract class Executor {
public abstract void performTask();
public static void execute(String condition) {
Executor executor = null;
if ( condition.equals("xyz")) {
executor = new AExector();
} else {
executor = new BExecutor();
}
executor.performTask();
}

}

执行器实现

B 上的操作创建一个不同的实现,称为 BExecutor :

public class BExecutor extends Executor {

public void performTask() {
System.out.println("launching handle from B");
//create or get data to perform the task on
B b = new B();
String name = b.getName();
System.out.println("I am from "+name);

}
}

C 上的操作创建一个不同的实现,称为 CExecutor :

public class CExecutor extends Executor {


public void performTask() {
System.out.println("launching handle from C");
//create or get data to perform the task on
C c = new C();
String value = c.getValue();
System.out.println("I am from "+value);

}
}

您的主要方法可以如下所示:

public static void main(String []args) { 
Executor executor = Executor.execute(condition);
}

并且出于某种原因,如果您确实找到了 BC 之间的某些共同契约,您总是会创建一个 interface ,它既 BC 可以实现和使用此 interface 的引用,而不是使用 BC引用。

关于java - 使用不相关类的相关类的有效设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39028694/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com