如何为复选框侦听器切换正确的 class?
how to toggle the right class for checkbox listener?
我有一个 GUI,带有一个开始按钮和一个复选框,可以根据给定的文本输入创建 Class A(我的 Web 服务的蓝图)的多个实例。如果选中该复选框,则会将一些附加元素写入 XML 文件(这是整个应用程序的主要输出)。现在我想添加一个额外的复选框,它将提供 GUI 来创建 Class B 的实例,它扩展了 Class A 但提供了一些额外的字段和逻辑。
我的问题是我该如何实现这个必需的功能?
鉴于 class C 中有一个 createMyXML()
方法,它对硬编码参数的作用与 Class A 或 Class B 的方法相同,我应该扩展它以将 class 之一作为参数并为 XML 中所需的元素创建实例?
P.S。这个问题可能太主观了,但我想知道这样做的方法或方法是什么'right way'。
Class 剖析
public class A {
private String id;
private Vector<String> inputs;
private Vector<String> outputs;
//***Getters and Setters for above.***
}
Class C 解剖
public class C {
void createMyXML(){
for (A a : this.parser.getAttributes()){
createFirstElement(A a);
createSecondElement(A a);
// Or (This behavior should be triggered by the checkbox)
createFirstElement(B b);
createSecondElement(B b);}
}
如果我对你的问题理解正确,你想要一种创建不同实例的方法,这些实例将根据不同于 class 到 class 的一些逻辑创建 XML 文件,最好是容易以后可以延长。
在这种情况下,Factory Design Pattern 似乎是一个合理的解决方案。您使用 craeteMyXML()
方法定义接口:
public interface I {
public void createMyXML();
}
为每个 XML 创建逻辑添加一个 class。在此示例中,我添加了两个 classes:A
和 B
,它们实现了 I
接口。
Class A
:
import java.util.Vector;
public class A implements I {
private String id;
private Vector<String> inputs;
private Vector<String> outputs;
@Override
public void createMyXML() {
System.out.println("Create XML by the rules of A.");
}
/* Getters and setters and other methods needed*/
}
Class B
:
public class B implements I {
@Override
public void createMyXML() {
System.out.println("Create XML by the rules of B.");
}
}
您可以使用 enum
作为创建实例所基于的工厂的参数。您也可以使用其他选项,例如 String
值或 int
,这取决于您的解决方案。在这里,我将可用实例定义为 enum
:
public enum Instance {
A, B
}
Factory
class 使用超类型 I
.
创建 A
或 B
的实例
public class Factory {
public static I createInstance(Instance i) {
if (i == Instance.A) {
return new A();
} else if (i == Instance.B) {
return new B();
} else {
return null;
}
}
}
我正在添加一个 Test
class 来快速测试此解决方案,您可以将其合并到您的项目中。
public class Test {
public static void main(String[] args) {
I a = Factory.createInstance(Instance.A);
I b = Factory.createInstance(Instance.B);
a.createMyXML();
b.createMyXML();
}
}
当你执行这个时,它会产生输出:
Create XML by the rules of A.
Create XML by the rules of B.
我有一个 GUI,带有一个开始按钮和一个复选框,可以根据给定的文本输入创建 Class A(我的 Web 服务的蓝图)的多个实例。如果选中该复选框,则会将一些附加元素写入 XML 文件(这是整个应用程序的主要输出)。现在我想添加一个额外的复选框,它将提供 GUI 来创建 Class B 的实例,它扩展了 Class A 但提供了一些额外的字段和逻辑。
我的问题是我该如何实现这个必需的功能?
鉴于 class C 中有一个 createMyXML()
方法,它对硬编码参数的作用与 Class A 或 Class B 的方法相同,我应该扩展它以将 class 之一作为参数并为 XML 中所需的元素创建实例?
P.S。这个问题可能太主观了,但我想知道这样做的方法或方法是什么'right way'。
Class 剖析
public class A {
private String id;
private Vector<String> inputs;
private Vector<String> outputs;
//***Getters and Setters for above.***
}
Class C 解剖
public class C {
void createMyXML(){
for (A a : this.parser.getAttributes()){
createFirstElement(A a);
createSecondElement(A a);
// Or (This behavior should be triggered by the checkbox)
createFirstElement(B b);
createSecondElement(B b);}
}
如果我对你的问题理解正确,你想要一种创建不同实例的方法,这些实例将根据不同于 class 到 class 的一些逻辑创建 XML 文件,最好是容易以后可以延长。
在这种情况下,Factory Design Pattern 似乎是一个合理的解决方案。您使用 craeteMyXML()
方法定义接口:
public interface I {
public void createMyXML();
}
为每个 XML 创建逻辑添加一个 class。在此示例中,我添加了两个 classes:A
和 B
,它们实现了 I
接口。
Class A
:
import java.util.Vector;
public class A implements I {
private String id;
private Vector<String> inputs;
private Vector<String> outputs;
@Override
public void createMyXML() {
System.out.println("Create XML by the rules of A.");
}
/* Getters and setters and other methods needed*/
}
Class B
:
public class B implements I {
@Override
public void createMyXML() {
System.out.println("Create XML by the rules of B.");
}
}
您可以使用 enum
作为创建实例所基于的工厂的参数。您也可以使用其他选项,例如 String
值或 int
,这取决于您的解决方案。在这里,我将可用实例定义为 enum
:
public enum Instance {
A, B
}
Factory
class 使用超类型 I
.
A
或 B
的实例
public class Factory {
public static I createInstance(Instance i) {
if (i == Instance.A) {
return new A();
} else if (i == Instance.B) {
return new B();
} else {
return null;
}
}
}
我正在添加一个 Test
class 来快速测试此解决方案,您可以将其合并到您的项目中。
public class Test {
public static void main(String[] args) {
I a = Factory.createInstance(Instance.A);
I b = Factory.createInstance(Instance.B);
a.createMyXML();
b.createMyXML();
}
}
当你执行这个时,它会产生输出:
Create XML by the rules of A.
Create XML by the rules of B.