e Command{
public void execute();
}
我们将三个单选按钮扩展成特定的带有Command接口的类,我们就可以把对命令的执行从JFrame类转移到每个按钮的类。同时,我们创建一个叫做SexButton的基类,并将ActionListener代码移到基类中,这样就不需要分别在每个按钮中添加事件监听器:
//abstract radio button class
public abstract class SexButton
extends JRadioButton implements Command{
protected 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 method
public abstract void execute();
}
可扩展的Java应用程序开发模式(3)
时间:2010-12-24
注意这个类必须被扩展以使得它有用,因为我们没有具体化execute()方法。这个基本的抽象按钮类只是我们从中导出的具体类的一个模板,这实际也是模板设计模式的一个简单例子。
//radio button to select female swimmers
public class FemaleButton extends SexButton{
public execute(){
Vector v=swimmers.getList(true);
loadList(v);
}
private void loadList(Vector v){
kidList.clear();
for(int i=0;i Swimmer 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 Mediator{
private JawList kidList;
public Mediator(JawList klist){
kidList=klist;
}
public void loadList(Vector v){
kidList.clear();
for(int i=0;i Swimmer sw=(Swimmer)v.elementAt(i);
kidList.add(sw.getName());
}
}
}
这样我们的基类变成这样:
public abstract class SexButton
extends JRadioButton implements Command{
protected 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 list
public void execute(){
Vector v=swimmers.getList(true);
med.loadList(v);
}
}
可扩展的Java应用程序开发模式(4)
时间:2010-12-24
你看,我们使用Mediator来分离按钮和列表,使它们互相不知 |