可扩展的Java应用程序开发模式文档格式.docx
- 文档编号:17202349
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:5
- 大小:17.51KB
可扩展的Java应用程序开发模式文档格式.docx
《可扩展的Java应用程序开发模式文档格式.docx》由会员分享,可在线阅读,更多相关《可扩展的Java应用程序开发模式文档格式.docx(5页珍藏版)》请在冰豆网上搜索。
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;
i
Swimmerswm=(Swimmer)kids.elementAt(i);
if(swm.isFemal()==female)v.add(swm);
returnv;
我们又提供了一个不带参数的多态getList()方法来返回整个列表。
现在让我们进入程序中的第一个重要的部分,为了显示这些孩子的姓名,我们需要为三个单选按钮都添加一个事件监听器,使得每个都能显示出正确的孩子们:
publicvoidactionPerformed(ActionEvente){
//listenforbuttonclicksanddotherightthing
Objectobj=e.getSource();
if(obj==female)loadFemales();
if(obj==male)loadMales();
if(obj==both)loadBoth();
privatevoidloadFemales(){
//displayfemaleswimmers
Vectorv=swimmers.getList(true);
loadList(v);
privatevoidloadMales(){
//displaymaleswimmers
Vectorv=swimmers.getList(false);
尽管这个方法在简单、小型的情况下工作得很好,但是它没有良好的可扩展性。
如果你有10个按钮,扩展actionPerformed()方法来测试每个按钮和调用某些对应的操作,会使得可读性非常差。
相反,我们最好在包含用户接口的类中去掉所有的判定。
做到这点的一个途径是使用Command模式。
当我们使用这个模式的时候,需要我们创立一个Command接口:
//theCommandinterface
publicinterfaceCommand{
publicvoidexecute();
我们将三个单选按钮扩展成特定的带有Command接口的类,我们就可以把对命令的执行从JFrame类转移到每个按钮的类。
同时,我们创建一个叫做SexButton的基类,并将ActionListener代码移到基类中,这样就不需要分别在每个按钮中添加事件监听器:
//abstractradiobuttonclass
publicabstractclassSexButton
extendsJRadioButtonimplementsCommand{
protectedSwimmerssimmers;
//JawListisasubclassofJScrollPanecontainedaJList;
protectedJawListkidList;
publicSexButton(Stringtitle,Swimmerssw,
JawListklist,ActionListeneral){
super(title);
swimmers=sw;
kidList=klist;
addActionListener(al);
//abstractexecutemethod
publicabstractvoidexecute();
注意这个类必须被扩展以使得它有用,因为我们没有具体化execute()方法。
这个基本的抽象按钮类只是我们从中导出的具体类的一个模板,这实际也是模板设计模式的一个简单例子。
//radiobuttontoselectfemaleswimmers
publicclassFemaleButtonextendsSexButton{
publicexecute(){
privatevoidloadList(Vectorv){
kidList.clear();
Swimmerswm=(Swimmer)v.elementAt(i);
kidList.add(swm.getName());
现在,来看一下我们完成的工作。
所有的按钮都成为了Command按钮了,actionPerformed()方法也简化成下面这样简单的方法:
Commandcmd=(Command)e.getSource();
cmd.execute();
正如你看到的,这更加简单而且完全是可扩展的。
但我们还有要做的事情。
现在我们写了三个单选按钮类,它们知道如何载入一个列表框。
在我们匆忙地想要从主类之外得到消息时,我们要求每个按钮都知道列表框。
如果我们想要改成一个不同的显示方式,就必须修改这三个类。
如果我们在按钮和列表之间创建一个mediator(调停者)类就会好得多,因为它们彼此不需要知道对方。
Mediator(调停者)设计模式能够做到这一点。
当一个按钮被点击时,我们创建一个调停者类载入列表。
这样所有按钮只知道调停者,哪个列表被载入也只有调停者才知道,当我们想要改成一个不同的显示方式就只需修改Mediator:
publicclassMediator{
privateJawListkidList;
publicMediator(JawListklist){
publicvoidloadList(Vectorv){
Swimmersw=(Swimmer)v.elementAt(i);
kidList.add(sw.getName());
这样我们的基类变成这样:
protectedSwimmersswimmers;
protectedMediatormed;
publicSexButton(Stringtitle,Swimmerssw,Mediatormd,ActionListeneral){
med=md;
而FemalButton则变成这样:
//usethemediatortoloadthelist
publicvoidexecute(){
med.loadList(v);
你看,我们使用Mediator来分离按钮和列表,使它们互相不知道对方。
除了可以使用命令、调停者、模板模式改进这个不到100行的Java代码的简单程序外,还可以使用观察者(Observer)模式。
这个程序使用JListData将数据传给列表并从列表中获得数据,并用LawList观察JListData的变化。
publicclassJListDataextendsAbstractListModel{
privateVectordata;
publicJListData(){
data=newVector();
publicintgetSize(){
returndata.size();
publicObjectgetElementAt(intindex){
returndata.elementAt(index);
publicvoidaddElement(Strings){
data.addElement(s);
fireIntervalAdded(this,data.size()-1,data.size());
publicvoidremoveElement(Strings){
data.removeElement(s);
fireIntervalRemoved(this,0,data.size());
publicvoidclear(){
intsize=data.size();
data.clear();
fireIntervalRemoved(this,0,size);
publicclassJawListextendsJScrollPane{
privateJListlistwindow;
privateJListDatalistContents;
publicJawList(){
listContents=newJList
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 扩展 Java 应用程序 开发 模式