2014-02-28 87 views
0

首先,我將呈現一定程度緊密耦合類的快速輪廓(雖然不是最糟糕的情況下):傳遞參數通過構造

class setUpGUI { 

    ... 
    JTextField output = new JTextField(); 
    ... 
    CountTimer ct; 
    ... 

    public void setOtputText(String text) { 
     output.setText(text); 

    public startTimer() { 
     ct = new CountTimer(); 
    } 

    ... 
} 

class CountTimer implements ActionListener { 

    private String text = ""; 
    private gui = new SetUpGUI(); 
    ... 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     ... 
     gui.setOtputText(text); 
     ... 
    } 

我的問題是關於第二代碼段(在與所述第一比較並在其自己的):

// functionally equivalent to com.google.gwt.user.client.ui.HasText 
interface HasText { 

    String getText(); 
    void setText(String text); 

} 

class setUpGUI { 

    ... 
    JTextField output = new JTextField(); 
    ... 
    CountTimer ct; 
    ... 

    public void setOtputText(String text) { 
     output.setText(text); 

    public startTimer() { 
     ct = new CountTimer(output); 
    } 

    ... 
} 

class CountTimer implements ActionListener { 

    private String text = ""; 
    private HasText txtComp; 
    ... 

    CountTimer(txtComp) { 
     ... 
     this.txtComp = txtComp; 
     ... 
    } 


    @Override 
    public void actionPerformed(ActionEvent e) { 
     ... 
     txtComp.setText(text); 
     ... 
    } 
} 

相信所述第二設計可被認爲是鬆耦合,由於代替使用setter它通過構造,並在SAM傳遞一個參考e時間定義了它自己的HasText接口(因爲Swing似乎沒有一個接口,我沒有找到具有setText()方法的JtextComponentJLabel的共同父項)。你會同意嗎?

通過構造函數傳遞參數的一般態度是什麼?

回答

1

第二個示例將文本視圖組件傳遞給實現ActionListener的類。相反,考慮擴展AbstractAction以允許集中處理操作事件。在文本組件的特定情況下,TextAction可以訪問聚焦的文本組件以及JTextComponent偵聽的底層Document型號。作爲具體示例,概述了herehere,在整個EditorKit層次中使用這樣的預定義動作。

對於週期性操作(例如響應計時器時可能出現的問題),考慮讓ActionListener更新文本組件的Document;監聽視圖將自動更新以作爲響應。在這種情況下,偵聽器的構造函數將接收對文本組件模型的引用。

+0

我的第二個類實現了Swing Timer的ActionListener(不是文本字段)。 JTextField只是作爲一個可以容納文本的組件(它的*可編輯性*在這裏是errlelevant)。可能是'JLabel'。 –

+0

機制相同:讓計時器的偵聽器更新_view_組件的_model_,並且偵聽的_view_將自動更新以作爲響應。 – trashgod