动态网站制作指南 [  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相关基础知识(1).
.论 JINI 与蓝牙技术的结合应用时.
.关于java中字符编码的一点心得,.
.面向对象思想之--继承以及多态.
.kjava安全技术文档草案.
.基于weblogic 的ejb 学习笔记(二.
.深入讨论JSF中Tree2组件使用方法.
.Java开发中关于Hibernate对多表关.
.Hibernate的继承关系.
.关于java.exe是如何载入JVM.
.使用JMS在集群应用程序中分配任务.
.百慕大银行客户自助业务方案.
.教程/系统编程 在Java中处理日志.
.Corba的模块模型概况.
.用Java编写的记事本程序(2).
.简单的 Java 循环控制实现行列式.
.Java 理论与实践: Web 层的状态复.
.Eclipse 3.0 简介和插件开发示例.
.使用Eclipse Callisto分析应用程.
.使用Annotations设计一个MVC框架.

为什么要用内部类:控制框架

发表日期:2008-1-5 |



  到目前为止,大家已接触了对内部类的运作进行描述的大量语法与概念。但这些并不能真正说明内部类存在的原因。为什么Sun要如此麻烦地在Java 1.1里添加这样的一种基本语言特性呢?答案就在于我们在这里要学习的“控制框架”。
  
  一个“应用程序框架”是指一个或一系列类,它们专门设计用来解决特定类型的问题。为应用应用程序框架,我们可从一个或多个类继续,并覆盖其中的部分方法。我们在覆盖方法中编写的代码用于定制由那些应用程序框架提供的常规方案,以便解决自己的实际问题。“控制框架”属于应用程序框架的一种非凡类型,受到对事件响应的需要的支配;主要用来响应事件的一个系统叫作“由事件驱动的系统”。在应用程序设计语言中,最重要的问题之一便是“图形用户界面”(GUI),它几乎完全是由事件驱动的。正如大家会在第13章学习的那样,Java 1.1 AWT属于一种控制框架,它通过内部类完美地解决了GUI的问题。
  
  为理解内部类如何简化控制框架的创建与使用,可认为一个控制框架的工作就是在事件“就绪”以后执行它们。尽管“就绪”的意思很多,但在目前这种情况下,我们却是以计算机时钟为基础。随后,请熟悉到针对控制框架需要控制的东西,框架内并未包含任何特定的信息。首先,它是一个非凡的接口,描述了所有控制事件。它可以是一个抽象类,而非一个实际的接口。由于默认行为是根据时间控制的,所以部分实施细节可能包括:
  
  //: Event.java
  // The common methods for any control event
  package c07.controller;
  
  abstract public class Event {
   private long evtTime;
   public Event(long eventTime) {
    evtTime = eventTime;
   }
   public boolean ready() {
    return System.currentTimeMillis() >= evtTime;
   }
   abstract public void action();
   abstract public String description();
  } ///:~
  
  希望Event(事件)运行的时候,构建器即简单地捕捉时间。同时ready()告诉我们何时该运行它。当然,ready()也可以在一个衍生类中被覆盖,将事件建立在除时间以外的其他东西上。
  
  action()是事件就绪后需要调用的方法,而description()提供了与事件有关的文字信息。
  
  下面这个文件包含了实际的控制框架,用于治理和触发事件。第一个类实际只是一个“助手”类,它的职责是容纳Event对象。可用任何适当的集合替换它。而且通过第8章的学习,大家会知道另一些集合可简化我们的工作,不需要我们编写这些额外的代码:
  
  //: Controller.java
  // Along with Event, the generic
  // framework for all control systems:
  package c07.controller;
  
  // This is just a way to hold Event objects.
  class EventSet {
   private Event[] events = new Event[100];
   private int index = 0;
   private int next = 0;
   public void add(Event e) {
    if(index >= events.length)
     return; // (In real life, throw exception)
    events[index++] = e;
   }
   public Event getNext() {
    boolean looped = false;
    int start = next;
    do {
     next = (next + 1) % events.length;
     // See if it has looped to the beginning:
     if(start == next) looped = true;
     // If it loops past start, the list
     // is empty:
     if((next == (start + 1) % events.length)
       && looped)
      return null;
    } while(events[next] == null);
    return events[next];
   }
   public void removeCurrent() {
    events[next] = null;
   }
  }
  
  public class Controller {
   private EventSet es = new EventSet();
   public void addEvent(Event c) { es.add(c); }
   public void run() {
    Event e;
    while((e = es.getNext()) != null) {
     if(e.ready()) {
      e.action();
      System.out.println(e.description());
      es.removeCurrent();
     }
    }
   }
  } ///:~
  
  EventSet可容纳100个事件(若在这里使用来自第8章的一个“真实”集合,就不必担心它的最大尺寸,因为它会根据情况自动改变大小)。index(索引)在这里用于跟踪下一个可用的空间,而next(下一个)帮助我们寻找列表中的下一个事件,了解自己是否已经循环到头。在对getNext()的调用中,这一点是至关重要的,因为一旦运行,Event对象就会从列表中删去(使用removeCurrent())。所以getNext()会在列表中向前移动时碰到“空洞”。
  
  注重removeCurrent()并不只是指示一些标志,指出对象不再使用。相反,它将句柄设为null。这一点是非常重要的,因为假如垃圾收集器发现一个句柄仍在使用,就不会清除对象。若认为自己的句柄可能象现在这样被挂起,那么最好将其设为null,使垃圾收集器能够正常地清除它们。
  
  Controller是进行实际工作的地方。它用一个EventSet容纳自己的Event对象,而且addEvent()答应我们向这个列表加入新事件。但最重要的方法是run()。该方法会在EventSet中遍历,搜索一个预备运行的Event对象——ready()。对于它发现ready()的每一个对象,都会调用action()方法,打印出description(),然后将事件从列表中删去。
  
  注重在迄今为止的所有设计中,我们仍然不能准确地知道一个“事件”要做什么。这正是整个设计的要害;它怎样“将发生变化的东西同没有变化的东西区分开”?或者用我的话来讲,“改变的意图”造成了各类Event对象的不同行动。我们通过创建不同的Event子类,从而表达出不同的行动。
  
  这里正是内部类大显身手的地方。它们答应我们做两件事情:
  
  (1) 在单独一个类里表达一个控制框架应用的全部实施细节,从而完整地封装与那个实施有关的所有东西。内部类用于表达多种不同类型的action(),它们用于解决实际的问题。除此以外,后续的例子使用了private内部类,所以实施细节会完全隐藏起来,可以安全地修改。
  
  (2) 内部类使我们具体的实施变得更加巧妙,因为能方便地访问外部类的任何成员。若不具备这种能力,代码看起来就可能没那么使人舒适,最后不得不寻找其他方法解决。
  
  现在要请大家思考控制框架的一种具体实施方式,它设计用来控制温室(Greenhouse)功能(注释④)。每个行动都是完全不同的:控制灯光、供水以及温度自动调节的开与关,控制响铃,以及重新启动系统。但控制框架的设计宗旨是将不同的代码方便地隔离开。对每种类型的行动,都要继续一个新的Event内部类,并在action()内编写相应的控制代码。
  
  ④:由于某些非凡原因,这对我来说是一个经常需要解决的、非常有趣的问题;原来的例子在《C++ Inside & Out》一书里也出现过,但Java提供了一种更令人舒适的解决方案。
  
  作为应用程序框架的一种典型行为,GreenhouseControls类是从Controller继续的:
  
  //: GreenhouseControls.java
  // This prodUCes a specific application of the
  // control system, all in a single class. Inner
  // classes allow you to encapsulate different
  // functionality for each type of event.
  package c07.controller;
  
  public class GreenhouseControls
    extends Controller {
   private boolean light = false;
   private boolean water = false;
   private String thermostat = "Day";
   private class LightOn extends Event {
    public LightOn(long eventTime) {
     super(eventTime);
    }
    public void action() {
     // Put hardware control code here to
     // physically turn on the light.
     light = true;
    }
    public String description() {
     return "Light is on";
    }
   }
   private class LightOff extends Event {
    public LightOff(long eventTime) {
     super(eventTime);
    }
    public void action() {
     // Put hardware control code here to
     // physically turn off the light.
     light = false;
    }
    public String description() {
     return "Light is off";
    }
   }
   private class WaterOn extends Event {
    public WaterOn(long eventTime) {
     super(eventTime);
    }
    public void action() {
     // Put hardware control code here
     water = true;
    }
    public String description() {
     return "Greenhouse water is on";
    }
   }
   private class WaterOff extends Event {
    public WaterOff(long eventTime) {
     super(eventTime);
    }
    public void action() {
     // Put hardware control code here
上一篇:多形性的覆盖与过载 人气:315
下一篇:构建器内部的多形性方法的行为 人气:313
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-7-24 Sablog-X v2.0 预览版
2008-7-24 帝国备份王EmpireBak 2008 正式版
2008-7-24 网趣网上购物系统时尚版 v8.2
2008-7-24 纵横B2B电子商务系统XYECS!B2B v
2008-7-24 e路小说小偷 v1.2.0723
2008-7-24 凌风美女图片站程序 v2.2
2008-7-24 TOM15电影收索程序
2008-7-24 清风信息自动采集生成系统 v1.0
2008-7-24 QQ邮箱编辑器 v1.0 (小小菜刀ASP
2008-7-19 UltraEdit 简体中文增强版 14.10
2008-7-19 CentOS 5.2 i386 LiveCD
2008-7-19 Snapture多功能相机 v1.4
2008-7-19 iAcces中文输入法 v1.0Build016
2008-7-19 Cookbook烹饪秘籍 v2.5
2008-7-19 苹果专用DVD转换工具 v1.1.59汉化
2008-7-19 Modem修复软件ZiPhone修改版04.0
2008-7-19 AgileMessenger即时通讯工具美化
2008-7-19 Sketches画图软件 v0.7b6破解版


  发表评论
姓 名: 验证码:
内 容:
[ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
[ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵