`

利用UML类图设计Java应用程序详解(二)

 
阅读更多
在第一部分中,我们实现了5个类。在本部分中,我们接着说明如何利用UML类图来设计余下的各个类。为减少篇幅,本部分着重讲解UML类图及应用,对Java实现代码不再详细描述。

  六、CGPoint类
  CGPoint类说明了如何利用非抽象类扩展抽象类。CGPoint类是CGObject的子类,CGPoint类扩展了CGObject类,CGPoint类没有再它所继承的变量中增加变量,它所声明的方法只有构造函数和要求它实现的抽象方法。其类图如下:
  
  Java实现代码为:
  // CGPoint.java
  public class CGPoint extends CGObject {
  // Method declarations
  public CGPoint(int x, int y,char ch) {
  location = new Point(x,y);
  drawCharacter = ch;
  }
  public CGPoint(int x, int y) {
  this(x,y,'+');
  }
  public CGPoint(Point p) {
  this(p.getX(),p.getY(),'+');
  }
  public CGPoint(Point p,char ch) {
  this(p.getX(),p.getY(),ch);
  }
  public void display(PrintCGrid grid) {
  grid.setCharAt(drawCharacter,location);
  }
  public void describe() {
  System.out.print("CGPoint "+String.valueOf(drawCharacter)+" ");
  System.out.println(location.toString());
  }
  }
  七、CGBox类
  CGBox类也扩展了CGObject类。CGBox类提供了在网格上显示矩形的附加变量。CGBox类的类图如下:
  
  相应的代码为:
  // CGBox.java
  public class CGBox extends CGObject {
  // Variable declarations
  protected Point lr; // Lower right corner of a box
  // Method declarations
  public CGBox(Point ulCorner, Point lrCorner,char ch) {
  location = ulCorner;
  lr = lrCorner;
  drawCharacter = ch;
  }
  public CGBox(Point ulCorner, Point lrCorner) {
  this(ulCorner,lrCorner,'#');
  }
  public void display(PrintCGrid grid) {
  int width = lr.getX() - location.getX() + 1;
  int height = lr.getY() - location.getY() + 1;
  Point topRow = new Point(location);
  Point bottomRow = new Point(location.getX(),lr.getY());
  for(int i=0; i<width; ++i) {
  grid.setCharAt(drawCharacter,topRow);
  grid.setCharAt(drawCharacter,bottomRow);
  topRow = topRow.add(1,0);
  bottomRow = bottomRow.add(1,0);
  }
  Point leftCol = new Point(location);
  Point rightCol = new Point(lr.getX(),location.getY());
  for(int i=0;i>height;++i){
  grid.setCharAt(drawCharacter,leftCol);
  grid.setCharAt(drawCharacter,rightCol);
  leftCol = leftCol.add(0,1);
  rightCol = rightCol.add(0,1);
  }
  }
  public void describe() {
  System.out.print("CGBox "+String.valueOf(drawCharacter)+" ");
  System.out.println(location.toString()+" "+lr.toString());
  }
  }
  八、CGText类
  CGText类是CGObject中的第三个子类。其类图与代码分别如下:
  
  // CGText.java
  public class CGText extends CGObject {
  // Variable declarations
  String text;
  // Method declarations
  public CGText(Point p,String s) {
  location = p;
  drawCharacter = ' ';
  text = s;
  }
  public void display(PrintCGrid grid) {
  Point p = new Point(location);
  for(int i=0;i<text.length();++i){
  grid.setCharAt(text.charAt(i),p);
  p = p.add(1,0);
  }
  }
  public void describe() {
  System.out.println("CGText "+location.toString()+" "+text);
  }
  }>
  以下是CGObject类、CGPoint类、CGBox类、CGText类及Point类之间的相互关系。注意CGObject类是抽象类,其类名用斜体表示。
  
  九、KeyboardInput类
  KeyboardInput类扩展了Java API的DataInputStream类,用来提供获取用户键盘输入的一系列常用的简单方法。其类图设计为:
  
  代码为:
  import java.lang.System;
  import java.io.DataInputStream;
  import java.io.InputStream;
  import java.io.IOException;
  //KeyboardInput.java
  public class KeyboardInput extends DataInputStream {
  public KeyboardInput(InputStream inStream) {
  super(inStream);
  }
  public char getChar() throws IOException {
  String line = readLine();
  if(line.length()==0) return ' ';
  return line.charAt(0);
  }
  public String getText() throws IOException {
  String line = readLine();
  return line;
  }
  public int getInt() throws IOException {
  String line = readLine();
  Integer i = new Integer(line);
  return i.intValue();
  }
  public Point getPoint() throws IOException {
  System.out.print(" x-coordinate: ");
  System.out.flush();
  int x = getInt();
  System.out.print(" y-coordinate: ");
  System.out.flush();
  int y = getInt();
  return new Point(x,y);
  }
  }
  十、CDrawApp类
  主程序由CDrawApp类所构成。它包含main()方法,main()方法建立类CDraw的对象,然后调用该对象的run()方法。其中CDraw类属于内部类,当然你也可以将它单独作为一个类文件编辑、编译,其效果是一样的。
  其中类与内部类之间的关系,用关联关系来表达,外部类用一个十字交叉圆圈表示,箭头指向内部类。如下图所示:
  
  其代码实现为:
  import java.lang.System;
  import java.io.DataInputStream;
  import java.io.IOException;
  //CDrawApp.java
  class CDrawApp {
  public static void main(String args[]) throws IOException {
  CDraw program = new CDraw();
  program.run();
  }
  }
  class CDraw {
  // Variable declarations
  static KeyboardInput kbd = new KeyboardInput(System.in);
  BorderedPrintCGrid grid;
  // Method declarations
  CDraw() {
  grid = new BorderedPrintCGrid();
  }
  void run() throws IOException {
  boolean finished = false;
  do {
  char command = getCommand();
  switch(command){
  case 'P':
  addPoint();
  System.out.println();
  break;
  case 'B':
  addBox();
  System.out.println();
  break;
  case 'T':
  addText();
  System.out.println();
  break;
  case 'U':
  grid.deleteLastObject();
  System.out.println();
  break;
  case 'C':
  grid.clearGrid();
  System.out.println();
  break;
  case 'S':
  grid.show();
  break;
  case 'X':
  finished = true;
  default:
  System.out.println();
  }
  } while (!finished);
  }
  char getCommand() throws IOException {
  System.out.println("CDrawApp P - Add a Point U - Undo Last Add");
  System.out.print ("Main Menu B - Add a Box C - Clear Grid");
  System.out.println(" X - Exit CDrawApp");
  System.out.print (" T - Add Text S - Show Grid ");
  System.out.print (" Enter command: ");
  System.out.flush();
  return Character.toUpperCase(kbd.getChar());
  }
  void addPoint() throws IOException {
  System.out.println("Add Point Menu");
  System.out.println(" Location:");
  Point p = kbd.getPoint();
  System.out.print(" Character: ");
  System.out.flush();
  char ch = kbd.getChar();
  if(ch==' ') ch = '+';
  CGPoint cgp = new CGPoint(p,ch);
  cgp.addToGrid(grid);
  }
  void addBox() throws IOException {
  System.out.println("Add Box Menu");
  System.out.println(" Upper Left Corner:");
  Point ul = kbd.getPoint();
  System.out.println(" Lower Right Corner:");
  Point lr = kbd.getPoint();
  System.out.print(" Character: ");
  System.out.flush();
  char ch = kbd.getChar();
  if(ch==' ') ch = '#';
  CGBox box = new CGBox(ul,lr,ch);
  box.addToGrid(grid);
  }
  void addText() throws IOException {
  System.out.println("Add Text Menu");
  System.out.println(" Location:");
  Point p = kbd.getPoint();
  System.out.print(" Text: ");
  System.out.flush();
  String text = kbd.getText();
  CGText cgt = new CGText(p,text);
  cgt.addToGrid(grid);
  }
  }
  主程序CDrawApp类与相应类之间的关系为:
  
  按照本文次序分别编译以上的10个大类,然后运行主程序CdrawApp即可。在程序运行时请注意:当选择增加点、框或者文本串后,选择Show Grid才能出现网格,并显示结果。
  本文通过一个具体的程序开发过程,详细说明了如何使用UML类图来设计Java应用程序,使得程序开发可视化,文档标准化,便于相互协作与管理,是Java应用程序开发的方向。
分享到:
评论

相关推荐

    利用UML类图设计Java应用程序详解.doc

    利用UML类图设计Java应用程序详解.doc

    利用UML序列图设计Java应用程序详解

    要利用UML设计Java应用程序,仅仅使用类图来描述这些静态关系,利用可视化工具,要实现Java应用程序的代码自动生成,是远远不够的。我们还必须描述各种类相互之间的协作关系、动态关系,如时间序列上的交互行为。...

    利用UML序列图设计Java应用程序详解 

    要利用UML设计Java应用程序,仅仅使用类图来描述这些静态关系,利用可视化工具,要实现Java应用程序的代码自动生成,是远远不够的。我们还必须描述各种类相互之间的协作关系、动态关系,如时间序列上的交互行为。...

    抽象工厂模式uml类图

    java设计模式 抽象工厂模式详解 一张图让你彻底明白抽象工厂模式

    java多线程设计模式详解(PDF及源码)

    通过程序范例和UML图示来一一解说,书中代码的重要部分加了标注以使读者更加容易理解,再加上图文并茂,对于初学者还是程序设计高手来说,这都是一本学习和认识JAVA设计模式的一本好书。(注意,本资源附带书中源...

    Java设计模式

    Java设计模式详解,包含设计模式概述、适用性范围、参与者、uml类图、源码实例。由疯狂Java联盟整理提供

    人事面试100问及Java面试文档资料.zip

    UML类图详解.mht 中兴SQL题目.doc 中兴面试--公共部分.doc 人事面试100问.doc 你一定要给我记住啊.docx 好多不懂的Servlet以及Jsp.doc 学习笔记.doc 实践50.doc 深圳信狮职业培训学校java面试题.doc 第2章 递归与...

    JAVA面试资料全集

    这里提供了各打公司的JAVA面试资料和许多的高科技技术UML类图详解

    面向对象技术与UML课件及源代码-by 南邮-陈杨

    本书为中南大学精品教材立项项目,分为上下两篇共21章,涵盖了面向对象技术中Java开发环境配置、程序设计基础、面向对象原理以及UML的知识。本书使用的开发环境是JDK 1.6+Eclipse 3.3+Rational Rose 2003,逐步引领...

    java基础案例与开发详解案例源码全

    1.2.5 Java在应用领域的优势7 1.3 Java平台的体系结构7 1.3.1 JavaSE标准版8 1.3.2 JavaEE企业版10 1.3.3 JavaME微型版11 1.4 JavaSE环境安装和配置12 1.4.1 什么是JDK12 1.4.2 JDK安装目录和实用命令工具介绍12 ...

    高级Java软件架构师学习计划

    面向对象程序设计与编码 Java流操作和文件系统 Java图形用户界面编程 异常处理与事件响应 Java基础类库与中期项目实战 Java多线程编程、网络编程 项目实战 J2EE中级 数据库基础与linux操作系统 JDBC程序...

    疯狂JAVA讲义

    2.1.3 面向对象程序设计简介 27 2.1.4 面向对象的基本特征 28 2.2 UML(统一建模语言)介绍 29 2.2.1 用例图 30 2.2.2 类图 31 2.2.3 组件图 33 2.2.4 部署图 33 2.2.5 顺序图 34 2.2.6 活动图 34 2.2.7 ...

    asp.net知识库

    ASP.NET 2.0使用Web Part创建应用程序之二(共二) 体验 .net2.0 的优雅(2) -- ASP.net 主题和皮肤 NET2.0系列介绍(一).NET 2.0 中Web 应用程序主题的切换 ASP.NET 2.0 中Web 应用程序主题的切换 2.0正式版中...

    UML统一建模语言初学

    类图详解: 1)构成形式:举一个例子:2)内部类: 我们使用诸如下边的方式表示内部类,定义在方法区例如:3)访问描述符: 对于Java,我们用如下的符号表示访问描述符: 我们在下图详细说明了各个访问描述符的...

Global site tag (gtag.js) - Google Analytics