执行此操作的经典方法是模型-视图-控制器 http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller就是在运行时将对象绑定在一起。控制器(您的操作侦听器)采用参数来指示要操作的视图和模型。
正如 Aqua 提到的,这种参数的使用也称为“依赖注入”。
public static void main( String[] args )
{
Model model = new Model();
View view = new View();
ActionListener listener = new MyActionListener( model, view );
view.addActionListener( listener );
}
private static class MyActionListener implements ActionListener
{
private Model model;
private View view;
public MyActionListener( Model model, View view )
{
this.model = model;
this.view = view;
}
}
在 Java 中,您可以作一点欺骗,因为 ActionEvent 有一个指向事件源的指针(通常是生成事件的视图/JComponent)。
private static class MyActionListener implements ActionListener
{
private Model model;
public MyActionListener( Model model )
{
this.model = model;
}
@Override
public void actionPerformed( ActionEvent e )
{
JComponent source = (JComponent) e.getSource();
// source == "view"...
}
}
要设置新文档,您可以创建一个“文档持有者”类。 “新建”菜单项将新文档放入 Holder 类中。所有其他菜单项从持有者类“获取”文档。这是一个相当严格的 OO 范例,它不使用静态方法或字段,尽管它有点乏味。
Set up:
public static void main( String[] args )
{
ModelDocumentHolder model = new ModelDocumentHolder();
View view = new View();
ActionListener listener = new NewDocument( model );
view.addActionListener( listener );
View view2 = new View();
view2.addActionListener( new RegularListener( model ) );
}
新文档监听器:
private static class NewDocument implements ActionListener
{
private ModelDocumentHolder model;
public NewDocument( ModelDocumentHolder model )
{
this.model = model;
}
@Override
public void actionPerformed( ActionEvent e )
{
model.setDoc( new Document() );
}
}
大多数其他菜单项:
private static class RegularListener implements ActionListener
{
private ModelDocumentHolder model;
public RegularListener( ModelDocumentHolder model )
{
this.model = model;
}
@Override
public void actionPerformed( ActionEvent e )
{
JComponent source = (JComponent) e.getSource();
Document doc = model.getDoc();
// do stuff...
}
}
持有者类别:
private static class ModelDocumentHolder
{
private Document doc;
public Document getDoc()
{
return doc;
}
public void setDoc( Document doc )
{
this.doc = doc;
}
}