MyException - 我的异常网
当前位置:我的异常网» J2SE » 为什么要使用内部类解决方案

为什么要使用内部类解决方案(2)

www.MyException.Cn  网友分享于:2013-03-01  浏览:8次

   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 

-

------解决方案--------------------
探讨
13楼说的很详细啊。
网上说GUI设计方面,内部类确实用的很多。
但不知道为什么要这么设计,仅仅是为了方便,简洁吗?

文章评论

一个程序员的时间管理
一个程序员的时间管理
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
Java程序员必看电影
Java程序员必看电影
编程语言是女人
编程语言是女人
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
程序员必看的十大电影
程序员必看的十大电影
老程序员的下场
老程序员的下场
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
程序员都该阅读的书
程序员都该阅读的书
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
漫画:程序员的工作
漫画:程序员的工作
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
总结2014中国互联网十大段子
总结2014中国互联网十大段子
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
每天工作4小时的程序员
每天工作4小时的程序员
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
10个调试和排错的小建议
10个调试和排错的小建议
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
代码女神横空出世
代码女神横空出世
那些争议最大的编程观点
那些争议最大的编程观点
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
 程序员的样子
程序员的样子
程序员应该关注的一些事儿
程序员应该关注的一些事儿
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
鲜为人知的编程真相
鲜为人知的编程真相
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
我的丈夫是个程序员
我的丈夫是个程序员
旅行,写作,编程
旅行,写作,编程
为什么程序员都是夜猫子
为什么程序员都是夜猫子
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
程序员的鄙视链
程序员的鄙视链
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
如何成为一名黑客
如何成为一名黑客
我是如何打败拖延症的
我是如何打败拖延症的
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有