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

原创 2004年08月08日 22:55:00
在第一部分中,我们实现了5个类。在本部分中,我们接着说明如何利用UML类图来设计余下的各个类。为减少篇幅,本部分着重讲解UML类图及应用,对Java实现代码不再详细描述。

  六、CGPoint类
  CGPoint类说明了如何利用非抽象类扩展抽象类。CGPoint类是CGObject的子类,CGPoint类扩展了CGObject类,CGPoint类没有再它所继承的变量中增加变量,它所声明的方法只有构造函数和要求它实现的抽象方法。其类图如下:
  s9810_13.jpg
  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类的类图如下:
  s9810_14.jpg
  相应的代码为:
  // 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中的第三个子类。其类图与代码分别如下:
  s9810_15.jpg
  // 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类是抽象类,其类名用斜体表示。
  s9810_16.jpg
  九、KeyboardInput类
  KeyboardInput类扩展了Java API的DataInputStream类,用来提供获取用户键盘输入的一系列常用的简单方法。其类图设计为:
  s9810_17.jpg
  代码为:
  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类属于内部类,当然你也可以将它单独作为一个类文件编辑、编译,其效果是一样的。
  其中类与内部类之间的关系,用关联关系来表达,外部类用一个十字交叉圆圈表示,箭头指向内部类。如下图所示:
  s9810_18.jpg
  其代码实现为:
  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类与相应类之间的关系为:
  s9810_19.jpg
  按照本文次序分别编译以上的10个大类,然后运行主程序CdrawApp即可。在程序运行时请注意:当选择增加点、框或者文本串后,选择Show Grid才能出现网格,并显示结果。
  本文通过一个具体的程序开发过程,详细说明了如何使用UML类图来设计Java应用程序,使得程序开发可视化,文档标准化,便于相互协作与管理,是Java应用程序开发的方向。

Java集合类的UML类图

网上能搜到很多Java集合类的类图,但是感觉都不是非常明晰。于是自己绘制了一份。...
  • vking_wang
  • vking_wang
  • 2013年11月26日 15:41
  • 9137

Java抽象类用法示例详解

转自Java抽象类用法示例详解 Java抽象类的定:java抽象类体现数据抽象的思想,是实现程序多态性的一种手段。也提到抽象类与抽象方法的限制,下面我们会通过一下java抽象类小示例来给你介绍抽象类...
  • qingfengzaishou
  • qingfengzaishou
  • 2016年01月09日 18:56
  • 4961

java中抽象类的定义和使用

java虽然比较简单,但是细节的知识点还是很多的,现在,介绍一下抽象类的定义和实现基础。指的是在类中定义方法,而不去实现它,而在它的子类中去具体实现,继承抽象类的子类必须实现父类的抽象方法,除非子类是...
  • morixinguan
  • morixinguan
  • 2016年11月02日 16:54
  • 3080

java|抽象类和接口及抽象类的常用项目经验

深入理解java的抽象类和接口,为以后设计接口和类做好铺垫!
  • change_lhj2
  • change_lhj2
  • 2016年09月02日 23:39
  • 541

Java抽象类 详解

一、抽象类的基本概念普通类是一个完善的功能类,可以直接产生实例化对象,并且在普通类中可以包含有构造方法、普通方法、static方法、常量和变量等内容。而抽象类是指在普通类的结构里面增加抽象方法的组成部...
  • wei_zhi
  • wei_zhi
  • 2016年10月05日 00:06
  • 20601

java第四天--抽象函数、抽象类与包和访问权限

抽象类和抽象函数 只有函数定义,没有函数体的函数被称为抽象函数: abstract void fun(); 抽象类:使用abstract定义的类被称为抽象类 1.抽象类不能生成对象,只能子类被继承,子...
  • Hiter1140510116
  • Hiter1140510116
  • 2017年03月16日 22:01
  • 331

从模板方法模式深入理解Java抽象类

阿里面试的时候被问到:接口不能实现,必须由抽象类实现的典型场景?这不就是典型的模板方法模式嘛!钩子方法和具体方法的存在使抽象类与接口具有了最主要的差异: 接口主要体现的是一种规范,实现接口的类只能去实...
  • zhangliangzi
  • zhangliangzi
  • 2016年05月22日 17:12
  • 1681

Java中为何要定义抽象类

抽象方法:由abstract修饰的方法为抽象方法,抽象方法只有方法的定义,没有方法的实现。 抽象类:一个类中如果包含抽象方法,个i类应该用abstract关键字声明为抽象类。 抽象类不可以实例化,...
  • lv_a1b2c3
  • lv_a1b2c3
  • 2016年10月19日 10:48
  • 905

java基础复习------>抽象类能初始化吗?

1.抽象类能够初始化吗?答案是:肯定的,抽象类可以初始化! 2.但是抽象类不能够直接new 初始化,你不信看下图: 3.所以我们初始化抽象类,是间接的!接来下介绍两种间接的初始化抽象类方法   ...
  • IT_COOKIE_SAM
  • IT_COOKIE_SAM
  • 2017年02月24日 17:20
  • 744

Java 抽象类、普通类、接口的区别——值得你一看的干货

【概念】 抽象类、具体类是相对的,并非绝对的。抽象是一种概念性名词,具体是一种可见可触摸的现实对象。概念越小,则其抽象程度就越大,其外延也越大,反之亦然。简单说,比如“人”比“男人”抽象...
  • csdn_aiyang
  • csdn_aiyang
  • 2017年05月04日 16:26
  • 2357
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用UML类图设计Java应用程序详解(二)
举报原因:
原因补充:

(最多只允许输入30个字)