[英]how to toggle the right class for checkbox listener?
我有一个带有开始按钮和复选框的GUI,该复选框可根据给定的文本输入创建Class A(我的Web服务的蓝图)的多个实例。 如果选中此复选框,则将一些其他元素写入XML文件(这是整个应用程序的主要输出)。 现在,我想添加一个额外的复选框,该复选框将提供用于创建B类实例的GUI的GUI,该实例扩展了A类,但提供了一些其他字段和逻辑。
我的问题是如何实现所需的功能?
给定类C中有一个createMyXML()
方法,对于硬编码参数,其方法与类A或类B的方法相同,我是否应该对其进行扩展以将其中一个类作为参数并在其中创建所需元素的实例XML?
PS:这个问题可能太主观了,但我想知道这样做的方法或“正确方法”是什么。
A类解剖
public class A {
private String id;
private Vector<String> inputs;
private Vector<String> outputs;
//***Getters and Setters for above.***
}
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);}
}
如果我对您的问题理解正确,那么您想要一种创建不同实例的方法,该方法将根据某些类之间的逻辑(最好是以后可以轻松扩展)来创建XML文件。
在这种情况下, 工厂设计模式似乎是一个合理的解决方案。 您可以使用craeteMyXML()
方法定义一个接口:
public interface I {
public void createMyXML();
}
为每个XML创建逻辑添加一个类。 在此示例中,我添加了两个类: A
和B
,它们实现了I
接口。
类别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*/
}
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
类使用超类型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
类来快速测试该解决方案,您可以将其合并到您的项目中。
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();
}
}
执行此命令时,将产生输出:
按照A的规则创建XML。
按照B的规则创建XML。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.