正如 jjohns 所指出的,您可以使用 Observers 和 Observables
编辑
他可能不是那个意思。 从 Java 9 开始,这种观察者模式已被弃用。
一种替代方法是声明您自己的事件,该事件是 EventObject 的子类:
class UserChangeEvent extends EventObject {
private String actionCommand; // additional property for more control
public UserChangeEvent(Object source, String actionCommand) {
super(source);
this.actionCommand = actionCommand;
}
public String getActionCommand() { return actionCommand; }
}
然后,声明一个将处理事件的接口(@987654329@ 将是“回调”方法):
interface UserChangeListener {
/**
* Fired when any user property changes
* @param event
*/
public void onUserChange(UserChangeEvent event);
}
这是User 类的示例:
class User {
private List<UserChangeListener> changeListeners = new ArrayList<UserChangeListener>();
private String username;
private String email;
public User(String username, String email) {
this.username = username;
this.email = email;
}
/**
* Registers a UserChangeListener instance that will be notified when any setter is called
* @param listener the new event listener
*/
public void addUserChangeListener(UserChangeListener listener) {
changeListeners.add(listener);
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username; // actually set the username
UserChangeEvent event = new UserChangeEvent(this, "username"); // a new instance of our custom user change event
// fire user change event for all event listeners
for (UserChangeListener listener:changeListeners) {
listener.onUserChange(event);
}
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
UserChangeEvent event = new UserChangeEvent(this, "email");
for (UserChangeListener listener:changeListeners) {
listener.onUserChange(event);
}
}
}
这是User、UserChangeEvent和UserChangeListener的简单实现:
public class Test {
public static void main(String[] args) {
User hworld1234 = new User("hworld1234", "hworld@example.com");
hworld1234.addUserChangeListener(new UserChangeListener() {
@Override
public void onUserChange(UserChangeEvent event) {
String actionCommand = event.getActionCommand(); // what we gave our custom event in the setters
if ("username".equals(actionCommand)) {
System.out.println("username has been changed to '" + hworld1234.getUsername() + "'");
} else if ("email".equals(actionCommand)) {
System.out.println("email has been changed to '" + hworld1234.getEmail() + "'");
}
}
});
hworld1234.setEmail("hworld@gmail.com"); // prints "email has been changed to 'hworld@gmail.com'"
}
}
如果您愿意,另一种方法是为要“绑定”的每个属性声明一个 onXXXChange 并忘记 actionCommand 属性;不过,如果你在一个接口中甚至有多个方法,你可能应该把它变成一个适配器。