科技行者

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

知识库

知识库 安全导航

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

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

  • 扫一扫
    分享文章到微信

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

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

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

关键字:

  • 评论
  • 分享微博
  • 分享邮件
 现在,来看一下我们完成的工作。所有的按钮都成为了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<v.size();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);
  }
  }
  
  你看,我们使用Mediator来分离按钮和列表,使它们互相不知道对方。
  
  除了可以使用命令、调停者、模板模式改进这个不到100行的Java代码的简单程序外,还可以使用观察者(Observer)模式。这个程序使用JListData将数据传给列表并从列表中获得数据,并用LawList观察JListData的变化。
  
  public class JListData extends AbstractListModel{
  private 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());
  }
  
  public void clear(){
  int size=data.size();
  data.clear();
  fireIntervalRemoved(this,0,size);
  }
  }
  
  public class JawList extends JScrollPane{
  private JList listwindow;
  private JListData listContents;
  
  public JawList(){
  listContents=new JList
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

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

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