




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
可扩展的Java应用程序开发模式现在很多JAVA书籍,在介绍SWING的事件模型时,为了使JAVA初学者容易理解和上手,通常是在主类(自己的JFrame子类或JPanel)中做所有事情:要么由主类作为监听器,在接口的方法中通过判定事件源来决定具体做何事;要么在主类中使用内隐类来实现监听器,(因为内隐类可以方便的访问主类中的成员变量)。而很多JAVA初学者在往后的编程中也采用这种模式(至少我以前是这样的)。其实,这种做法虽然简单,却缺乏可读性、可扩展性和可维护性。之前我看到了一篇关于这个问题的文章(来自于JavaPro),现整理出来与大家分享。下面我将用一个简单的例子来说明如何使用模式来解决这个问题。现在,假设我们要编写一个使用几个单选按钮从一个长列表中选择不同分组的程序。单击Female单选按钮时,只有女孩的名字被显示;当你点击Male按钮时,程序显示男孩的名字。这个程序最简单的版本是在主类中做每件事情,主类包含一些持有孩子姓名的数组和向量(Vector),一个另一个最简单的方法是为每个孩子创建一个对象,每个对象有一个象isFemal()这样的方法来帮助我们确定要显示的是男的还是女的。在程序中我们把每个孩子的类称为Swimmer:public class Swimmerprivate String name;private int age;private String club;private boolean female;public Swimmer(String name,int age,String club,boolean female)=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;iSwimmer 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 thingObject obj=e.getSource();if(obj=female) loadFemales();if(obj=male) loadMales();if(obj=both) loadBoth();private void loadFemales()/display female swimmersVector v=swimmers.getList(true);loadList(v);private void loadMales()/display male swimmersVector v=swimmers.getList(false);loadList(v);尽管这个方法在简单、小型的情况下工作得很好,但是它没有良好的可扩展性。如果你有10个按钮,扩展actionPerformed()方法来测试每个按钮和调用某些对应的操作,会使得可读性非常差。相反,我们最好在包含用户接口的类中去掉所有的判定。做到这点的一个途径是使用Command模式。当我们使用这个模式的时候,需要我们创立一个Command接口:/the Command interfacepublic interface Commandpublic void execute();我们将三个单选按钮扩展成特定的带有Command接口的类,我们就可以把对命令的执行从JFrame类转移到每个按钮的类。同时,我们创建一个叫做SexButton的基类,并将ActionListener代码移到基类中,这样就不需要分别在每个按钮中添加事件监听器:/abstract radio button classpublic abstract class SexButtonextends JRadioButton implements Commandprotected 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 methodpublic abstract void execute();注意这个类必须被扩展以使得它有用,因为我们没有具体化execute()方法。这个基本的抽象按钮类只是我们从中导出的具体类的一个模板,这实际也是模板设计模式的一个简单例子。/radio button to select female swimmerspublic class FemaleButton extends SexButtonpublic execute()Vector v=swimmers.getList(true);loadList(v);private void loadList(Vector v)kidList.clear();for(int i=0;iSwimmer swm=(Swimmer)v.elementAt(i);kidList.add(swm.getName();现在,来看一下我们完成的工作。所有的按钮都成为了Command按钮了,actionPerformed()方法也简化成下面这样简单的方法:public void actionPerformed(ActionEvent e)Command cmd=(Command)e.getSource();cmd.execute();正如你看到的,这更加简单而且完全是可扩展的。但我们还有要做的事情。现在我们写了三个单选按钮类,它们知道如何载入一个列表框。在我们匆忙地想要从主类之外得到消息时,我们要求每个按钮都知道列表框。如果我们想要改成一个不同的显示方式,就必须修改这三个类。如果我们在按钮和列表之间创建一个mediator(调停者)类就会好得多,因为它们彼此不需要知道对方。Mediator(调停者)设计模式能够做到这一点。当一个按钮被点击时,我们创建一个调停者类载入列表。这样所有按钮只知道调停者,哪个列表被载入也只有调停者才知道,当我们想要改成一个不同的显示方式就只需修改Mediator:public class Mediatorprivate JawList kidList;public Mediator(JawList klist)kidList=klist;public void loadList(Vector v)kidList.clear();for(int i=0;iSwimmer sw=(Swimmer)v.elementAt(i);kidList.add(sw.getName();这样我们的基类变成这样:public abstract class SexButtonextends JRadioButton implements Commandprotected Swimmers swimmers;protected Mediator med;public SexButton(String title,Swimmers sw,Mediator md,ActionListener al)super(title);swimmers=sw;med=md;addActionListener(al);public abstract void execute();而FemalButton则变成这样:public class FemaleButton extends SexButton/use the mediator to load the listpublic void execute()Vector v=swimmers.getList(true);med.loadList(v);你看,我们使用Mediator来分离按钮和列表,使它们互相不知道对方。除了可以使用命令、调停者、模板模式改进这个不到100行的Java代码的简单程序外,还可以使用观察者(Observer)模式。这个程序使用JListData将数据传给列表并从列表中获得数据,并用LawList观察JListData的变化。public class JListData extends AbstractListModelprivate Vector data;public JListData()data=new Vector();public int getSize()return data.size();public Object getElementAt(int index)return data.elementAt(index);public void addElement(String s)data.addElement(s);fireIntervalAdded(this,data.size()-1,data.size();public void removeElement(String s)data.removeElement(s);fireIntervalRemoved(this,0,data.size()
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 情感教育与情商提升活动计划
- 2024年云南省生态环境厅下属事业单位真题
- 2024年云南省戒毒管理局下属事业单位真题
- 2024年西藏自治区商务厅下属事业单位真题
- 2025年行业竞争格局变化分析试题及答案
- 感受软件设计师职业的乐趣试题及答案
- 2025届江苏省无锡市宜兴市七年级数学第二学期期末统考试题含解析
- 2024年培黎职业学院辅导员考试真题
- 2024年南京师范大学辅导员考试真题
- 2025年绿色金融对企业战略的影响试题及答案
- 中考物理实验19 (考点精讲)测量滑轮组的机械效率
- 2024年湖北省中考地理·生物试卷(含答案解析)
- GB/T 44241-2024虚拟电厂管理规范
- JGT 160-2017 混凝土用机械锚栓
- 南通辅警考试题库
- 连续蒸煮螺旋喂料器
- DL-T904-2015火力发电厂技术经济指标计算方法
- 新时代劳动教育教程(高校劳动教育课程)全套教学课件
- 北京市某低温热水地板辐射采暖工程设计 毕业设计
- 懂设备原理会维护保养
- 英语中考专题复习-短文填空
评论
0/150
提交评论