一般而言,我們需要設計我們的類如此以至於每一類做“一件事”。當涉及用戶接口代碼時就更顯得尤為重要,因為它很容易地封裝“您要做什麼”和“怎樣顯示它”。這種有效的配合防止了代碼的重復使用。更不用說它令人滿意的從GUI中區分出我們的“事物邏輯”。使用這種方法,我們可以不僅僅更容易地重復使用事物邏輯,它同樣可以更容易地重復使用GUI。
其它的爭議是“動作對象”存在的完成分離機器的多層次系統。動作主要的定位規則允許所有新事件修改後立刻生效,並且這是如此一個引人注目的設置系統的方法。但是這些動作對象可以被在一些不同的應用程序使用並且因此不會被一些特殊的顯示模式所約束。它們會合理地執行動作操作並且沒有多余的事件。
下面的例子演示了從GUI代碼中多麼地輕松的區分事物邏輯:
//: Separation.java
// Separating GUI logic and business objects
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
class BusinessLogic {
private int modifier;
BusinessLogic(int mod) {
modifier = mod;
}
public void setModifier(int mod) {
modifier = mod;
}
public int getModifier() {
return modifier;
}
// Some business operations:
public int calculation1(int arg) {
return arg * modifier;
}
public int calculation2(int arg) {
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 void init() {
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 int getValue(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 static void main(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代碼使它運行時,怎樣使它更易存活。