EDIT(2013年5月16日)調用一個方法:良好的MVC設計由許多類
我會用我的第三個解決方案。謝謝大家的幫助。編輯
END(2013年5月16日)
我有更新方法的圖(控制器內)。該方法必須由許多類調用。所以我想出了兩個解決方案:
- 在每個需要調用update方法的類中爲View/Controller創建一個字段。
- 使更新方法爲靜態。
什麼是更好的(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日)
這一切取決於你是否需要'View'的內部狀態。如果你使它成爲靜態的,你需要使整個狀態成爲靜態 - 這顯然是代碼異味。如果你不需要一個狀態,那麼每個類都應該有它自己的'View'實例。如果您需要共享狀態,則需要在決定如何共享課程實例之前回答自己的問題「在兩個或更多類同時調用更新方法時會發生什麼情況」。 – 2013-05-12 00:18:02