将商业逻辑与UI逻辑区分开

一般而言,我们需要设计我们的类如此以至于每一类做“一件事”。当涉及用户接口代码时就更显得尤为重要,因为它很容易地封装“您要做什么”和“怎样显示它”。这种有效的配合防止了代码的重复使用。更不用说它令人满意的从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代码使它运行时,怎样使它更易存活。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索int
, new
, 逻辑
, 事物
, public
, Modifier
逻辑与
逻辑与、说话的逻辑与技巧 pdf、逻辑与的符号、说话的逻辑与技巧、说话的逻辑与技巧txt,以便于您获取更多的相关知识。

时间: 2024-12-26 10:27:36

将商业逻辑与UI逻辑区分开的相关文章

传参-刚开始学习VB.NET 怎么把逻辑代码和业务代码分开写?Form可以调用,代码本身可能会有一点问题

问题描述 刚开始学习VB.NET 怎么把逻辑代码和业务代码分开写?Form可以调用,代码本身可能会有一点问题 From1 Imports System.Data Imports System.Data.OracleClient Imports System.Text Public Class Form1 #Region "定义变量" Private ConnString As String = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(

iOS 环信的消息通知和我们App内部的消息通知怎么区分开呢? 环信的消息通知的推送是在服务端做的 还是环信自身就有 不需要在服务端设置

问题描述 iOS 环信的消息通知和我们App内部的消息通知怎么区分开呢? 环信的消息通知的推送是在服务端做的 还是环信自身就有  不需要在服务端设置 解决方案 环信的推送是环信服务器控制的,推送有f 和 m 字段,对应的是消息发送者的id和messageId.可以根据这个区分,环信推送内容的解析可以看这里:http://docs.easemob.com/doku.p ... ntent解决方案二:本省就有,不需要做太多,只需要吧证书配置好

C++短路求值(逻辑与、逻辑或)实例_C 语言

本文实例讲述了C++短路求值(逻辑与.逻辑或),分享给大家供大家参考.具体方法分析如下: 1.逻辑或的短路 首先看如下代码: #include <iostream> using namespace std; int main() { int a = 1; cout << "a = " << a <<endl; true || (a=0); cout << "a = " << a <<

用c#把一串数字的连续的和不连续的区分开

问题描述 用c#把一串数字的连续的和不连续的区分开:数字:数量是随机的(最多24个),顺序是从小到大,范围是1-24,有些连续,有些不连续.例:[1,2,3,5,7,8,9,15,18,19,24]结果:1-3:5-5:7-9:15-15:18-19:24-24例:[5,8,9,10,11,13,14,15,16,18,19]结果,5-5,8-11:13-16,18-19 解决方案 解决方案二:既然"顺序是从小到大",直接判断就可以了:int[]nums={1,2,3,5,7,8,9,

基础才是重中之重~用好“逻辑与”和“逻辑或”,可以让你的程序更优美!

当进行"与"运算时,从左向右比较,出现一个为false时,立即退出,不会比较后台的,即使后面的有异常程序也不报错     当进行"或"运算时,从左向右比较,出现一个为true时,立即退出,不会比较后台的,即使后面的有异常程序也不报错 List<int> arr = null; if ( arr != null && arr.Count > 0) //其实arr.Count会报语法错误,但这里是正确的用法,先比较是否为null,如果为

三层逻辑设计中逻辑层的输出问题

问题描述 逻辑层自表现层接受了用户的输入,经过逻辑层的处理以及从数据层取出来相应的数据,之后要输出给用户,那么应该如何做,直接newFrame()么?具体的说,逻辑层的类应该依赖表现层的类么?必须使用委托模式么? 解决方案 解决方案二:逻辑层的类不应该应该依赖表现层逻辑层是被表示层掉用数据显示处理应该由表示层处理

动态Linq的逻辑与和逻辑或的条件查询

最近在做一个数据检索的工作,对一个数据库中的宽表进行多个条件的检索.为了简单方便快捷的完成这个功能,我使用LINQ to SQL+ReportView的方式来完成. 首先需要做的是一个查询界面和写一个数据库查询方法.用户在输入框中输入多个指标,将根据指标的格式生成LINQ的Where语句.这个很容易实现,比如输入"2003 北京 人口",那么就根据空格将这个字符串分成3个字符串,第一个字符串格式是年份,所以用表中的Year字段进行匹配,第二个字段是地区,所以再用表中的Location进

特许经营vs商业机会——两者间的区别是什么?

问题:我现在开始注意特许经营组织和商业机会,你能告诉我它们两者之间的区别在哪里? 答案:有时候很难说出两者的区别,但是在签约加盟前,一定要清楚两者之间的区别. 最普遍的商业机会类型是超级市场批发商,供应体系和分配途径.通常公司都是按照附属的公司进行分配.总公司为运营者提供结果和账目或者位置从而确定分配途径.经营者通过已经确定的体系为顾客提供服务. 虽然特许经营中也有类似功能,但是两者之间的区别在于总公司和加盟者之间的关系不同.下面列出两者的一些不同点: 不同点:特许经营:特许经营商业是按照总公司

使用Java技术在Cocoon中实现商业逻辑

如果你对Apache Cocoon有了解或者以涉足,你可能对在Cocoon中如何使用Java更好 的实现特定的逻辑有所疑惑.这篇文章将给您介绍如何使用XSP(Extensible Server Page) 和Action.同时还有示例和设计原则. 你可能听到了一些来自Apache的关于Cocoon的声音.现在,在经历了三年的发展后, Cocoon已经逐渐的从一个简单的实现XSL (Extensible Stylesheet Language) 转换 的servlet成长为一个饱满的Web应用框架