动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.数据结构――栈、队列和树(Java).
.EJB技术之旅(一).
.利用MVC模式开发Java应用程序.
.一个简单的定时器应用: VarTime.
.软件过程的发展的思考.
.在Linux下驱动STN彩色LCD.
.EJB轻松进阶(4).
.关于cachedRowSet的一篇文章(jav.
.Java与其他语言数据类型之间的转.
.复合赋值运算符.
.用句柄操纵对象.
.常见的十四种Java开发工具及其特.
.Java语言的一些关键特性.
.JAVA程序员必读.
.Java加密和数字签名编程快速入门.
.maven的POM结构.
.文件下载程序中文件名过长的问题.
.Java编程中异常处理的优劣之道.
.教你如何编写Java类(三).
.开源Erlang真的能成为下一代Java.

可扩展的Java应用程序开发模式

发表日期:2008-1-5 |



  现在很多Java书籍,在介绍SWING的事件模型时,为了使JAVA初学者轻易理解和上手,通常是在主类(自己的JFrame子类或JPanel)中做所有事情:要么由主类作为监听器,在接口的方法中通过判定事件源来决定具体做何事;要么在主类中使用内隐类来实现监听器,(因为内隐类可以方便的访问主类中的成员变量)。而很多JAVA初学者在往后的编程中也采用这种模式(至少我以前是这样的)。其实,这种做法虽然简单,却缺乏可读性、可扩展性和可维护性。之前我看到了一篇关于这个问题的文章(来自于《JavaPro》),现整理出来与大家分享。

  下面我将用一个简单的例子来说明如何使用模式来解决这个问题。

  现在,假设我们要编写一个使用几个单选按钮从一个长列表中选择不同分组的程序,就象下图中看到的。单击Female单选按钮时,只有女孩的名字被显示;当你点击Male按钮时,程序显示男孩的名字。

可扩展的Java应用程序开发模式(图一)
  这个程序最简单的版本是在主类中做每件事情,主类包含一些持有孩子姓名的数组和向量(Vector),一个另一个最简单的方法是为每个孩子创建一个对象,每个对象有一个象isFemal()这样的方法来帮助我们确定要显示的是男的还是女的。在程序中我们把每个孩子的类称为Swimmer:

public class Swimmer{
 private String name;
 private int age;
 private String club;
 private boolean female;

 public Swimmer(String name,int age,String club,boolean female){
  this.name=name;
  this.age=age;
  this.club=club;
  this.female=female;
 }

 public boolean isFemale(){
  return female;
 }

 public String getName(){
  return name;
 }

 public int getAge(){
  return age;
 }

 public String getClub(){
  return club;
 }
}

  下一步我们要做的是决定整个列表中的哪些孩子会被显示。我们可以在主用户接口类中做到这点,但是最好的是在一个叫做Swimmers的集合类中来做,这个类有一个getList()方法,它带有布尔型的参数来决定是男孩还是女孩:

//get a vector of swimmers who are (female)
public Vector getList(boolean female){
 Vector v=new Vector();
 for(int i=0;i  Swimmer swm=(Swimmer)kids.elementAt(i);
  if(swm.isFemal()==female) v.add(swm);
 }
 return v;
}

  我们又提供了一个不带参数的多态getList()方法来返回整个列表。

  现在让我们进入程序中的第一个重要的部分,为了显示这些孩子的姓名,我们需要为三个单选按钮都添加一个事件监听器,使得每个都能显示出正确的孩子们:

public void actionPerformed(ActionEvent e){
 //listen for button clicks and do the right thing
 Object obj=e.getSource();
 if(obj==female) loadFemales();
 if(obj==male) loadMales();
 if(obj==both) loadBoth();
}

private void loadFemales(){
 //display female swimmers
 Vector v=swimmers.getList(true);
 loadList(v);
}

private void loadMales(){
 //display male swimmers
 Vector v=swimmers.getList(false);
 loadList(v);
}

  尽管这个方法在简单、小型的情况下工作得很好,但是它没有良好的可扩展性。假如你有10个按钮,扩展actionPerformed()方法来测试每个按钮和调用某些对应的操作,会使得可读性非常差。相反,我们最好在包含用户接口的类中去掉所有的判定。

  做到这点的一个途径是使用Command模式。当我们使用这个模式的时候,需要我们创立一个Command接口:

//the Command interface
public interface Command{
 public void execute();
}

  我们将三个单选按钮扩展成特定的带有Command接口的类,我们就可以把对命令的执行从JFrame类转移到每个按钮的类。同时,我们创建一个叫做SexButton的基类,并将ActionListener代码移到基类中,这样就不需要分别在每个按钮中添加事件监听器:

//abstract radio button class
public abstract class SexButton
extends JRadioButton implements Command{
 protected Swimmers simmers;
 //JawList is a subclass of JScrollPane contained a JList;
 protected JawList kidList;

 public SexButton(String title,Swimmers sw,
 JawList klist,ActionListener al){
  super(title);
  swimmers=sw;
  kidList=klist;
  addActionListener(al);
 }

 //abstract execute method
 public abstract void execute();
}

  注重这个类必须被扩展以使得它有用,因为我们没有具体化execute()方法。这个基本的抽象按钮类只是我们从中导出的具体类的一个模板,这实际也是模板设计模式的一个简单例子。

//radio button to select female swimmers
public class FemaleButton extends SexButton{
 public execute(){
  Vector v=swimmers.getList(true);
  loadList(v);
 }

 private void loadList(Vector v){
  kidList.clear();
  for(int i=0;i   Swimmer swm=(Swimmer)v.elementAt(i);
   kidList.add(swm.getName());
  }
 }
}

  现在,来看一下我们完成的工作。所有的按钮都成为了Command按钮了,actionPerformed()方法也简化成下面这样简单的方法:

public void actionPerformed(ActionEvent e){
 Command cmd=(Command)e.getSource();
 cmd.execute();
}

  正如你看到的,这更加简单而且完全是可扩展的。
  但我们还有要做的事情。现在我们写了三个单选按钮类,它们知道如何载入一个列表框。在我们匆忙地想要从主类之外得到消息时,我们要求每个按钮都知道列表框。假如我们想要改成一个不同的显示方式,就必须修改这三个类。


上一篇:J2ME网络应用程序性能探讨 人气:471
下一篇:JavaBeans程序开发从入门到精通 人气:448
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-12-4 PhpCMS2008 bulid 081203 简体中
2008-12-4 Menalto Gallery v1.5.10 多国语
2008-12-4 Phpcms2008 bulid 081203 简体中
2008-12-4 乘风多用户计数器 v3.92 (Acc)
2008-12-4 乘风多用户计数器 v3.92 (Sql)
2008-12-4 BBSxp 2008 8.0.5 SP2 Build 081
2008-12-4 ASBLOG v2.5 bulid 081118(1201)
2008-12-4 非零坊幽默短信 v3.4
2008-12-4 红茶巴士(公交)查询系统 v3.0
2008-11-29 Tencent Traveler 4.4
2008-11-29 龙卷风网络收音机 v3.0.0.0
2008-11-29 Intel Chipset Software Install
2008-11-29 TweakVI 1.0 Build 1100
2008-11-29 Opera 9.62 Build 10469
2008-11-29 MPlayer WW编译版 SVN-r28044(20
2008-11-29 NetTools网络工具v1.0.0破解版
2008-11-29 3DGallery三维体验1.1破解版
2008-11-29 SecretBook保密本v1.0破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | OPEN参数生成器 | 弹出式窗口代码产生器 | 密码登录生成器 | 在线按钮生成器 | Meta标签生成器 | 多色彩特效字代码生成器 | 网页代码调试器 | 在线FTP登陆 | Flash取色器 | 配色代码对照表 | 配色辞典 | CSS生成器 | 广告代码 | 框架网页代码生成器 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | 在线调色板 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 元素周期表 | 健康查询 | 世界时间 | 万年历 | 二十四节气 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2009 www.knowsky.com All rights reserved | 沪ICP备05001343号