如何从对象 B 调用对象 A 的方法,它本身就是 A 对象的属性?



我有一个登录表单对话框,显示在开始的步骤和用户必须登录继续应用程序。问题是,我不知道应用程序应该如何知道何时登录过程完成并继续。我认为我应该注册一个WindowListener,并实现windowClosing事件。在它里面,我应该从我的应用程序中调用一个方法来继续这个过程。但我不知道这个解怎么正确。因为我实现了登录表单作为一个类扩展JDialog和应用程序实例化它作为一个局部变量。因此,我认为从Login类内部调用应用程序的方法是不正确的。我不确定。这只是一种感觉。你有什么建议?

public class Application {
    private Login login = null;
    public Application() {
       login = new Login();   
    }
    public continue() {
        //...
    }
}
public class Login extends JDialog {
    public Login() {
       //...
    }
    public void processLogin() {
    }
    private class WindowEventHandler implements WindowListener {
        public void windowClosing(WindowEvent e) {
            if(#LoginProcessSuccessful?) {
                // call application's continue method
            }
        }
    }
}

使用和观察模式(又名监听器)。

基本上,Login将提供某种注册过程,允许感兴趣的各方向类的实例注册自己。

当所需的事件发生时,Login将通知这些各方事件已经发生…

基本前提是限制在类之间公开的信息量。Login除了告诉侦听器某个事件已经发生之外,不应该关心其他任何事情。这也意味着您没有将代码紧密耦合在一起,从而提供了更大的灵活性。

public interface LoginListener {
    public void loginSucceeded(); // You want to return some information about the caller...
    public void loginFailed();
}
public class Application implements LoginListener {
    private Login login = null;
    public Application() {
        login = new Login(this);   
    }    
    public void loginSucceeded() {
        // Yea for me
    }
    public void loginFailed() {
        // Sucks for you
    }
}
public class Login extends JDialog {
    private LoginListener listener;
    public Login(LoginListener listener) {
       //...
    }
    public void processLogin() {
        if (loginSuccessful()) {
            listener.loginSucceeded();
        } else {
            listener.loginFailed();
        }
    }
}
注意:这个例子使用了一个监听器,没有理由这样限制它,你可以提供一个机制来注册多个回调
public class Application {
    private Login login = null;
    public Application() {
       login = new Login(this);   
    }
    public continue() {
        //...
    }
}
public class Login extends JDialog {
   Application app;
    public Login(Application app) {
      this.app=app;
    }
    public void processLogin() {
    }
    private class WindowEventHandler implements WindowListener {
        public void windowClosing(WindowEvent e) {
            if(#LoginProcessSuccessful?) {
                this.app.continue()
            }
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新