假設系統界面基於 javax.swing 構建,基礎容器是 BaseView,它僅包含一個 JPanel,該面板承載所有 Swing 元件(JButton、JLabel 等)。業務需求常要求:完成當前界面操作自動跳轉到下一個,完成後又能跳回。這在實現過程中常成為效率殺手——見過有人用 600 行代碼判斷上一個界面是哪個,只因太多界面都能跳到當前界面。
在下一個界面類中包含指向上一個界面的變量?這不方便,還增加依賴性,對軟體不利。
以下用簡化模型闡述。
public abstract class BaseView extends JWindow {
// 實現獲取界面元件、資訊的方法
}
public class MyView extends BaseView {
JPanel myPanel;
public void playoutPanel() {
JButton myButton = new JButton("OK");
myPanel.add(myButton);
// 添加所需元件與佈局
}
}
假設 OneView、TwoView、ThreeView 處理完操作都需跳轉到 MyView,而 MyView 的 OK 按鈕需返回原界面。
原臃腫代碼需在 MyView 添加 BaseView anyView 存儲來源界面,跳轉代碼:
public void jump() {
MyView myView = new MyView();
myView.anyView = this;
this.remove(this.xxPanel);
this.add(myView.getPanel());
this.repaint();
}
返回時卻不容易,否則不會寫 600 行:
public void goBack() {
if (anyView instanceof OneView) {
anyView.remove(this.myView);
OneView ov = (OneView) anyView;
anyView.add(ov.getPanel());
anyView.repaint();
}
if (anyView instanceof TwoView) { ... }
...
}
大量 instanceof 判斷與轉型,編譯依賴性極強,效率低下。
在 BaseView 中定義統一的跳轉協議:
navigateTo(BaseView target) 方法處理面板切換goBack() 即可返回這樣消除了具體界面間的直接耦合,新增界面無需修改現有代碼,完美符合開閉原則。具體實現可參考「命令模式」或「狀態模式」管理導航狀態。