2013-05-12 85 views
2

EDIT(2013年5月16日)調用一個方法:良好的MVC設計由許多類

我會用我的第三個解決方案。謝謝大家的幫助。編輯

END(2013年5月16日)

我有更新方法的圖(控制器內)。該方法必須由許多類調用。所以我想出了兩個解決方案:

  1. 在每個需要調用update方法的類中爲View/Controller創建一個字段。
  2. 使更新方法爲靜態。

什麼是更好的(M)VC設計,如果兩個或多個類同時調用更新方法會發生什麼?

簡化實施例1:

public class View{ 
    public void update(){} 
} 

// Many classes: 
public class AClass{ 
    private View view; 

    private void aMethod(){ 
     view.update(); 
    } 
} 

簡化實施例2:

public class View{ 
    public static void update(){} 
} 

// Many classes: 
public class AClass{ 

    private void aMethod(){ 
     View.update(); 
    } 
} 

編輯(2013年5月12日):我同意, 「靜態溶液」 是不好的,尤其是爲OOP。

我過於簡單化豆蔻位,所以這裏是實際的設計:

比方說,你有一些MVC設計的方案,並希望把他們一起在一個「大」的計劃,但現在的程序必須從互動時常。

public class AView{ 
    public void update(){} 
} 

public class AModel{} 

//Many of these: 
public class AController{ 
    private AView aview; 
    private AModel amodel; 

    public AController(AView aview, AModel amodel){ 
     this.aview=aview; 
     this.amodel=amodel; 
    } 
} 

public class MainController{ 
    public MainController(){ 
     AView view1 = new AView(); 
     AModel model1 = new AModel(); 
     AController controller1 = new AController(view1, model1); 

     AView view2 = new AView(); 
     AModel model2 = new AModel(); 
     AController controller2 = new AController(view2, model2); 

     AView view3 = new AView(); 
     AModel model3 = new AModel(); 
     AController controller3 = new AController(view3, model3); 
    } 
} 

現在我們假設controller1和controller2需要調用view3的更新方法。 我目前的解決方案是在controller1和controller2中創建一個view3(如你所建議的)。

AController controller1 = new AController(view1, view3, model1); 
AController controller2 = new AController(view2, view3, model2); 

或者我應該重構整個設計還是在控制器之間創建一個「橋樑」?那麼這座「橋」會是怎樣的?

編輯結束(2013年5月12日)

編輯(2013年5月14日): 我想出了一個第三個解決方案: 每個控制器觸發它自己的事件。例如:

Controller1和Controller2觸發事件,Controller3偵聽它們,然後調用View3的更新方法。 您對這個解決方案有什麼看法?

編輯結束(2013年5月14日)

+1

這一切取決於你是否需要'View'的內部狀態。如果你使它成爲靜態的,你需要使整個狀態成爲靜態 - 這顯然是代碼異味。如果你不需要一個狀態,那麼每個類都應該有它自己的'View'實例。如果您需要共享狀態,則需要在決定如何共享課程實例之前回答自己的問題「在兩個或更多類同時調用更新方法時會發生什麼情況」。 – 2013-05-12 00:18:02

回答

0

我會用下面的設計,因爲這將是模塊化(感謝@Hovercraft全部鰻魚您指出緊耦合):

public class MainController{ 

    private Controller1 controller1; 
    private Controller2 controller2; 
    private Controller3 controller3; 

    public MainController(){ 
     controller1=new Controller1();    
     controller2=new Controller2();   
     controller3=new Controller3(); 

     addListeners(); 
    } 

    private class Ctrl1Listener implements Controller1Listener(){   
     public void controller1ActionPerformed(Controller1Event e){ 
      //Calls the method of view3  
      controller3.update(); 
     } 
    } 

    private class Ctrl2Listener implements Controller2Listener(){   
     public void controller2ActionPerformed(Controller2Event e){ 
      //Calls the method of view3  
      controller3.update(); 
     } 
    } 

    private void addListeners(){ 
     controller1.addListener(new Ctrl1Listener()); 
     controller2.addListener(new Ctrl2Listener()); 
    } 
} 

的意見是高度讚賞。

5

扔靜態解掉,只是甚至不考慮這一點,因爲這樣做你扔掉所有OOP窗外。如果需要,可以向控件公開update()方法調用視圖的方法。

說了這話之後,你的問題讓我擔心緊密耦合。

這些其他需要調用View更新的類 - 它們是Control類/庫的一部分嗎?只有控件應該在視圖上調用update。


編輯,你的狀態:

能否請您介紹一些關於「靜態方法拋出所有OOP窗外」我渴望得知。

當您使靜態方法不再是可繼承的,更重要的是,它不再是類的實例的方法,而是類的對象的方法。所以單獨的實例將不再有自己獨特的方法來調用,它不能從實例中獲取狀態數據,也不能改變實例的狀態。

+0

您能否詳細解釋一下「靜態方法將所有OOP拋出窗口」我渴望瞭解這一點。所以請。 – 2013-05-12 01:00:19

+0

@KanagaveluSugumar:請參閱編輯以回答。 – 2013-05-12 01:03:41

+0

+1謝謝。現在我懂了。 – 2013-05-12 01:06:18

0

我希望整個模型將更新相同的視圖,並保持更新各種數據。

public class View{ 
    private View(){} 
    public void update(){} 
    private static class singleTonFactory{ 
      private Static View obj = new View(); 
    } 

    public static View getViewInstance(){ 
      return singleTonFactory.obj; 
    } 
} 


// Many classes: 
public class AClass{ 
    private final View view = View.getViewInstance(); 

    private void aMethod(){ 
      view.update(); 
    } 
}