Swing 組件(如 JButton)已封裝完成,無法直接實現自定義 Observer 接口。如何在不修改組件源碼的前提下引入觀察者模式?
創建代理類包裝目標組件,代理類實現監聽接口,內部持有組件引用,轉發調用並擴展功能:
// 1. 定義觀察者接口
public interface ButtonObserver {
void onClick(JButton source);
}
// 2. 代理類實現接口,包裝 JButton
public class JButtonProxy implements ButtonObserver {
private JButton target;
private List observers = new ArrayList<>();
public JButtonProxy(JButton button) {
this.target = button;
// 給原組件添加匿名監聽,觸發時通知所有觀察者
target.addActionListener(e -> notifyObservers());
}
public void addObserver(ButtonObserver obs) { observers.add(obs); }
private void notifyObservers() {
for (ButtonObserver obs : observers) obs.onClick(target);
}
// 代理 JButton 的其他方法...
public void setText(String text) { target.setText(text); }
// ...
}