预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

www.027hpedu.com www.whhpit.com 可扩展的Java应用程序开发模式 现在很多JAVA书籍,在介绍SWING的事件模型时,为了使JAVA初学者容易理解和上手,通常是在主类(自己的JFrame子类或JPanel)中做所有事情:要么由主类作为监听器,在接口的方法中通过判定事件源来决定具体做何事;要么在主类中使用内隐类来实现监听器,(因为内隐类可以方便的访问主类中的成员变量)。而很多JAVA初学者在往后的编程中也采用这种模式(至少我以前是这样的)。其实,这种做法虽然简单,却缺乏可读性、可扩展性和可维护性。之前我看到了一篇关于这个问题的文章(来自于《JavaPro》),现整理出来与大家分享。下面我将用一个简单的例子来说明如何使用模式来解决这个问题。现在,假设我们要编写一个使用几个单选按钮从一个长列表中选择不同分组的程序。单击Female单选按钮时,只有女孩的名字被显示;当你点击Male按钮时,程序显示男孩的名字。这个程序最简单的版本是在主类中做每件事情,主类包含一些持有孩子姓名的数组和向量(Vector),一个另一个最简单的方法是为每个孩子创建一个对象,每个对象有一个象isFemal()这样的方法来帮助我们确定要显示的是男的还是女的。在程序中我们把每个孩子的类称为Swimmer:publicclassSwimmer{privateStringname;privateintage;privateStringclub;privatebooleanfemale;publicSwimmer(Stringname,intage,Stringclub,booleanfemale){this.name=name;this.age=age;this.club=club;this.female=female;}publicbooleanisFemale(){returnfemale;}publicStringgetName(){returnname;}publicintgetAge(){returnage;}publicStringgetClub(){returnclub;}}下一步我们要做的是决定整个列表中的哪些孩子会被显示。我们可以在主用户接口类中做到这点,但是最好的是在一个叫做Swimmers的集合类中来做,这个类有一个getList()方法,它带有布尔型的参数来决定是男孩还是女孩://getavectorofswimmerswhoare(female)publicVectorgetList(booleanfemale){Vectorv=newVector();for(inti=0;iSwimmerswm=(Swimmer)kids.elementAt(i);if(swm.isFemal()==female)v.add(swm);}returnv;}我们又提供了一个不带参数的多态getList()方法来返回整个列表。现在让我们进入程序中的第一个重要的部分,为了显示这些孩子的姓名,我们需要为三个单选按钮都添加一个事件监听器,使得每个都能显示出正确的孩子们:publicvoidactionPerformed(ActionEvente){//listenforbuttonclicksanddotherightthingObjectobj=e.getSource();if(obj==female)loadFemales();if(obj==male)loadMales();if(obj==both)loadBoth();}privatevoidloadFemales(){//displayfemaleswimmersVectorv=swimmers.getList(true);loadList(v);}privatevoidloadMales(){//displaymaleswimmersVectorv=swimmers.getList(false);loadList(v);}尽管这个方法在简单、小型的情况下工作得很好,但是它没有良好的可扩展性。如果你有10个按钮,扩展actionPerformed()方法来测试每个按钮和调用某些对应的操作,会使得可读性非常差。相反,我们最好在包含用户接口的类中去掉所有的判定。做到这点的一个途径是使用Command模式。当我们使用这个模式的时候,需要我们创立一个Command接口://theCommandinterfacepublicinterfaceCommand{publicvoidexecute();}我们将三个单选按钮扩展成特定的带有Command接口的类,我们就可以把对命令的执行从JFrame类转移到每个按钮的类。同时,我们创建一个叫做SexButton的基类,并将ActionLis