54.java编程思想——创建窗口和程序片 逻辑与UI分离
一般而言,我们需要设计我们的类如此以至于每一类做“一件事”。当涉及用户接口代码时就更显得尤为重要,因为它很容易地封装“您要做什么”和“怎样显示它”。这种有效的配合防止了代码的重复使用。更不用说它令人满意的从GUI 中区分出我们的“事物逻辑”。使用这种方法,我们可以不仅仅更容易地重复使用事物逻辑,它同样可以更容易地重复使用GUI。
其它的争议是“动作对象”存在的完成分离机器的多层次系统。动作主要的定位规则允许所有新事件修改后立刻生效,并且这是如此一个引人注目的设置系统的方法。但是这些动作对象可以被在一些不同的应用程序使用并且因此不会被一些特殊的显示模式所约束。它们会合理地执行动作操作并且没有多余的事件。
下面的例子演示了从GUI 代码中多么地轻松的区分事物逻辑:
1 代码
package ch13;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
class BusinessLogic {
private intmodifier;
BusinessLogic(int mod) {
modifier = mod;
}
public voidsetModifier(intmod){
modifier = mod;
}
public intgetModifier() {
return modifier;
}
// Somebusiness operations:
public intcalculation1(intarg){
return arg * modifier;
}
public intcalculation2(intarg){
return arg + modifier;
}
}
public class Separation extends Applet {
TextField t = new TextField(20), mod = new TextField(20);
BusinessLogic bl = new BusinessLogic(2);
Button calc1 = new Button("Calculation 1"), calc2 = new Button("Calculation 2");
public voidinit() {
add(t);
calc1.addActionListener(new Calc1L());
calc2.addActionListener(new Calc2L());
add(calc1);
add(calc2);
mod.addTextListener(new ModL());
add(new Label("Modifier:"));
add(mod);
}
static intgetValue(TextField tf){
try {
return Integer.parseInt(tf.getText());
} catch (NumberFormatException e) {
return 0;
}
}
class Calc1L implements ActionListener {
public void actionPerformed(ActionEvent e) {
t.setText(Integer.toString(bl.calculation1(getValue(t))));
}
}
class Calc2L implements ActionListener {
public void actionPerformed(ActionEvent e) {
t.setText(Integer.toString(bl.calculation2(getValue(t))));
}
}
class ModL implements TextListener {
public void textValueChanged(TextEvent e) {
bl.setModifier(getValue(mod));
}
}
public staticvoidmain(String[] args){
Separation applet = new Separation();
Frame aFrame = new Frame("Separation");
aFrame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
aFrame.add(applet, BorderLayout.CENTER);
aFrame.setSize(200, 200);
applet.init();
applet.start();
aFrame.setVisible(true);
}
} /// :~
事物逻辑是一个直接完成它的操作而不需要提示并且可以在GUI 环境下使用的类。它正适合它的工作。区分动作记录了所有UI 的详细资料,并且它只通过它的公共接口与事物逻辑交流。所有的操作围绕中心通过UI 和事物逻辑对象来回获取信息。因此区分,轮流做它的工作。因为区分中只知道它同事物逻辑对象对话(也就是说,它没有高度的结合),它可以被强迫同其它类型的对象对话而没有更多的烦恼。思考从事物逻辑中区分UI 的条件,同样思考当我们调整传统的Java 代码使它运行时,怎样使它更易存活。