科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件可扩展的Java应用程序开发模式

可扩展的Java应用程序开发模式

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

 现在很多JAVA书籍,在介绍SWING的事件模型时,为了使JAVA初学者容易理解和上手,通常是在主类(自己的JFrame子类或JPanel)中做所有事情:要么由主类作为监听器,在接口的方法中通过判定事件源来决定具体做何事;

作者:中国IT实验室 来源:中国IT实验室 2007年8月26日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
 我们又提供了一个不带参数的多态getList()方法来返回整个列表。
  
  现在让我们进入程序中的第一个重要的部分,为了显示这些孩子的姓名,我们需要为三个单选按钮都添加一个事件监听器,使得每个都能显示出正确的孩子们:
  
  public void actionPerformed(ActionEvent e){
  //listen for button clicks and do the right thing
  Object obj=e.getSource();
  if(obj==female) loadFemales();
  if(obj==male) loadMales();
  if(obj==both) loadBoth();
  }
  
  private void loadFemales(){
  //display female swimmers
  Vector v=swimmers.getList(true);
  loadList(v);
  }
  
  private void loadMales(){
  //display male swimmers
  Vector v=swimmers.getList(false);
  loadList(v);
  }
  
  尽管这个方法在简单、小型的情况下工作得很好,但是它没有良好的可扩展性。如果你有10个按钮,扩展actionPerformed()方法来测试每个按钮和调用某些对应的操作,会使得可读性非常差。相反,我们最好在包含用户接口的类中去掉所有的判定。
  
  做到这点的一个途径是使用Command模式。当我们使用这个模式的时候,需要我们创立一个Command接口:
  
  //the Command interface
  public interface 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();
  }
  
  注意这个类必须被扩展以使得它有用,因为我们没有具体化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<v.size();i++){
  Swimmer swm=(Swimmer)v.elementAt(i);
  kidList.add(swm.getName());
  }
  }
  }
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章