将商业逻辑与UI逻辑区分开2007-05-29 yycnet.yeah.net yyc译一般而言,我们需要设计我们的类如此以至于每一类做“一件事”。当涉及用户接口代码时就更显得尤为重要,因为它很容易地封装“您要做什么”和“怎样显示它”。这种有效的配合防止了代码的重复使用。更不用说它令人满意的从GUI中区分出我们的“事物逻辑”。使用这种方法,我们可以不仅仅更容易地重复使用事物逻辑,它同样可以更容易地重复使用GUI。
其它的争议是“动作对象”存在的完成分离机器的多层次系统。动作主要的定位规则允许所有新事件修改后立刻生效,并且这是如此一个引人注目的设置系统的方法。但是这些动作对象可以被在一些不同的应用程序使用并且因此不会被一些特殊的显示模式所约束。它们会合理地执行动作操作并且没有多余的事件。
下面的例子演示了从GUI代码中多么地轻松的区分事物逻辑:
//: Separation.java// Separating GUI logic and business objectsimport 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);Buttoncalc1 = 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代码使它运行时,怎样使它更易存活。