我有以下情况,想知道设计解决方案的最佳方法
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);
}
}
现在在上面的方法中,我无法从类C中访问类似aa.getName()的方法或从类C中访问aa.getValue(),这是有道理的。但是如何在执行器类中获取这些方法?执行人对B类和B类没有任何了解。 C并不应该知道。 Executor只知道A类,但想要访问B& S中的方法SubClass方法。 C从A类延伸。
请帮助设计这个以及解决此问题的最佳方法。
提前致谢。
答案 0 :(得分:2)
Executor只知道A类,但想要访问B& B的方法SubClass方法。 C从A类延伸。
如果仔细查看代码,您会注意到所有类中唯一的合同常量是launchHandle
方法(仅仅使用了getHelper
和initHelper
。用于实例化正确的子类)。 B
和C
之间没有真正的关系,除了它们的实例化由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
的{{1}}操作创建不同的实现:
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);
}
}
的{{1}}操作创建不同的实现:
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);
}
之间找到了一些常见合同,那么您始终会创建一个B
C
和interface
}可以实现和使用此B
的引用,而不是使用C
或interface
引用。
答案 1 :(得分:1)
将getName和getValue作为抽象方法添加到A.