站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2EE 专题解决日期选择问题,一劳永逸(使用Decorator模式实现日期选择组件)(一)

解决日期选择问题,一劳永逸(使用Decorator模式实现日期选择组件)(一)

摘要: 解决日期选择问题,一劳永逸(使用Decorator模式实现日期选择组件)(一)
内容: 摘要:在Java ToolBox 专栏中有该组件显示日历并通过单击选择日期的使用指南。它使用了“四人帮”设计模式,是此种模式的好例子;这篇文章同时注重日期组件与Decorator 模式的说明。相关代码演示了如何使用java.util.Calendar类和用自定义框架和标题栏来构造小Swing对话框的方法。(作者:Allen Holub)
当你构造客户端图形用户界面时,每隔几月便会出现的日期选择问题 。不幸的是JAVA并没有提供DataChooser 等类,且在最近一项Web研究中我发现data-selection组件略显笨重,我想让它变的简洁,易用。图 1 显示了该文章中类的几个变量,以便让你明白我说的在显示级别上的简洁的意思了。
IMG upload/forum/20031024115345.gif[/IMG]

图一 表示Data_selector对象的不同方式


免费网上获取方法是“一份耕耘,一份收获”原则的最好例子。可以将业余代码重写,使其成为有益代码。该文章的例子,是来自于网上,经过我的修改、整理,保留了很多原始代码,而整个结构也发生改变(或者,我该说,我只是为原来无组织的大量java代码增加了框架而此),这就是"免费"的好处。
此组件还提供了一个好的 Decorator 设计模式的演示并很好的探究了 java 的 Calendar 类,另外,他也展示了如何在Swing JDialog中如何实现你的标题栏和框架。

Decorators

和其他复杂问题一样,通过将大问题分成许多容易实现(和测试)的小问题来大大简化解决过程。Decorator 模式就是这样的一个很好的方法。
如果你用过java的i/o类,那你就看到过 Decorators 。比如:快速有效的读取经过压缩的字节流是个复杂问题,可通过将一个大的类实现分解成3个独立的子问题:
1,读字节
2,通过缓冲快速有效的读取
3,压缩字节流
java 使用FileInputStream 解决第一个问题.如下面所示:
try
{ InputStream in = new FileInputStream( "file.name" );
}
catch( IOException e )
{ System.err.println( "Couldn't open file.name" );
e.printStackTrace();
}

然后你可以使用修饰(或外包装) 策略增加缓冲。使用可缓冲字节的 inputStream 实现器来包装InputStream对象。然后你为每个字节进行包装,许多字节成为一包装流,并返回首字节。这种Decorator 包装过程如下:

try
{ InputStream in = new FileInputStream( "file.name" );
in = new BufferedInputStream( in );
}
catch( IOException e )
{ System.err.println( "Couldn't open file.name" );
e.printStackTrace();
}

另一个实现压缩的Decorator:
try
{ InputStream in = new FileInputStream( "file.name" );
in = new BufferedInputStream( in );
in = new GZipInputStream( in );
}
catch( IOException e )
{ System.err.println( "Couldn't open file.name" );
e.printStackTrace();
}

当然你也可以通过增加更多的 Decroators 来实现过滤功能。

这种解决方法是很灵活的,你可以整合与细化你所需的。更重要的是,因为每个Decorator 只解决一个单一的问题,所以每个都相对容易实现。因此,Decorator 是很容易在不影响系统其他部分进行编写,调试与修改。比如,我能够通过重写BufferedInputStream来改变缓冲法则,而不与其他 Decorator (或用到它们的其他代码)相关;我也能通过实现新的Decorator 来简单地添加新的过滤功能。(如CipherInputStream类已能过这种方法被添入到java类库中)。

日期选择 (Date-Selection)的核心问题

在Date-selection 问题中我使用了Decorator 的原则。核心问题是显示一月的日历。因此我首先做只实现该功能的一个类。
图2显示了Date_selector_panel用户界面,它只是一个日历,因为无须写一些无关代码 ,所以很容易实现。"今天"高亮度显示。如要选择一日期只需在其上面单击。(当你选择一日期的时候,存储了该组件的 ActionListener对象就会被激活。),背景默认透明,因为window窗体是灰色的所以它在这里显示的也是灰色的。
IMG upload/forum/20031024135159.gif[/IMG]
图2,一个原始的日期选择面板,无参数构建器

可以通过几种方法来“装饰”原始的日期选择器,使其更加有用。首先,你能在低端增加导航条(如图 3 所示),能通过单箭头、双箭头向前或向后移动月、年。
IMG upload/forum/20031024135540.gif[/IMG]
图 3 。增加导航
通过使用包装原始的日期选择面板的Decorator 对象增加导航条。由于包装与面板都继承于Data_selector接口,因此可交换地使用他们。下面的代码创建了如图3所示的装饰的日期选择器。
Date_selector selector = new Date_selector_panel();
selector = new Navigable_date_selector( selector );


创建包装的日期选择面板(Date_selector_panel)的通用构建器,也可以实现相同的效果:
Date_selector selector = new Navigable_date_selector();
提供另外一个参数是在日历中显示当前年与月的主题(见图4)
IMG upload/forum/20031024141628.gif[/IMG]
图 4 添加一主题。
和前面一样使用同样的Decorator 策略来增加名称:
Date_selector selector = new Date_selector_panel();
selector = new Navigable_date_selector( selector );
selector = new Titled_date_selector ( selector );

在上面的代码中,省略第二行便会取消导航条。如果你需要标题和导航条,他们的次序是无关紧要的 。直接的构造如下也可以生成没有导航条的日历选择器:
Date_selector selector = new Titled_date_selector();


最后要做的是如图5所示的小弹出框,能通过标题栏拖拽(也可以把该功能屏蔽)和通过单击右上角关闭按钮关闭。
IMG upload/forum/20031024142351.gif[/IMG]
图 5 date-selection 对话框
和前面一样,通过Decorator 来生成一个对话框。
Date_selector selector = new Date_selector_panel();
selector = new Navigable_date_selector( selector ); // 增加导航条

Date_selector_dialog popup = new Date_selector_dialog( selector );
//...
Date = popup.select(); // 返回用户选择日期,如果没有选择就关闭对话框则返回空值



// 你也可以这样做:

popup.setVisible( true ); // 弹出,
Date = popup.get_selected_date(); //获取选择日期
注意因为你用对话框标题栏所以这里你不需要在标题中整合。和上面一样,Date_selector_dialog定义了一个快速实现如图5的带有导航的对话框的构造器:
Date_selector = new Date_selector_dialog();


早期任何例子都是创建当前月日历。几种不同的方法通过编程来改变日期。大部分工作方式都如java.util.Calendar类相似的方法。

ealy ,java 爱好者,Matrix jsp翻译小组成员,可以点击http://www.matrix.org.cn/user_view.asp?username=ealy查看她的个人信息 
Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd, scwcd 摘要
↑返回目录
前一篇: 解决日期选择问题,一劳永逸(使用Decorator模式实现日期选择组件)(二)
后一篇: 使用Webflow组件创建Web应用(二)