正如我在MVC的標準實現中所知,我們將控制器和模型傳遞給視圖MVC - 我需要在視圖中使用控制器嗎?
但是,我有點不同意這個想法。我不希望我的觀點知道控制器和模型(哦不,也許有時候查看需求模型,但我確信他可以在沒有控制器知識的情況下生活)
在我看來,控制器應該管理視圖和模型,而Model不需要了解控制器和視圖;視圖不需要知道控制器(我不排除模型,因爲一些視圖的實現需要知道模型來聽取模型中的變化)。所以我的想法是,視圖不需要知道控制器。
下面是一個例子:
public class MyView implements ButtonClickListener {
private Controller myController;
private Button myButton;
// I commented out the model because we dont need it now
// we are talking about using controller in the view
public MyView(Controller c/*, Model m*/) {
myController = c;
myButton = new Button(); // lets say that it is "register" button
myButton.setOnButtonClickListener(this);
}
public void setRegisterButtonText(String text) {
myButton.setText(text);
}
@Override
public void onClick() {
myController.tellToModelToDoSomething();
}
}
和控制器:
public MyController implements Controller {
private Model model;
private View view;
public MyController(Model model) {
this.model = model;
this.view = new MyView(this);
}
public void tellToModelToDoSomething() {
model.doSomeActions();
}
}
2.現在我怎麼看這個實現,而沒有經過控制器:
我的看法:
public class MyView {
private Button myButton;
public MyView() {
myButton = new Button();
}
public void setRegisterButtonText(String text) {
myButton.setText(text);
}
public void setOnRegisterButtonClick(final Command command) {
myButton.setOnButtonClickListener(new ButtonClickListener() {
@Override
public void onClick() {
command.execute();
}
});
}
}
「命令」 接口:
public interface Command {
void execute(/*also can handle extra params*/);
}
和控制器:
public MyController implements Controller {
private Model model;
private View view;
public MyController(Model model) {
this.model = model;
this.view = new MyView();
view.setOnRegisterButtonClick(command);
}
public void tellToModelToDoSomething() {
model.doSomeActions();
}
private Command command = new Command() {
public void execute() {
tellToModelToDoSomething();
}
};
}
那麼,爲什麼我認爲,在視圖使用控制器不好:
我們是混合控制器並查看實現,創建新的依賴關係。
另外我認爲,視圖應該只包含VIEWS和與他們的操作(並使用控制器和他的一些方法已經看起來像邏輯)。
在第一個示例視圖中告訴控制器該做什麼。你同意嗎?它看起來像視圖控制控制器!
在第二個例子控制器控制做什麼,只是說給視圖做什麼,如果一些按鈕(僅視圖知道它會是什麼按鈕)點擊
我總是使用第二種方案,但看完後一本關於mvc的新書,說我們需要將控制器傳遞給視圖,我有點困惑。
你能幫我理解爲什麼我錯了,給我看一些例子嗎?
我相信,控制器和視圖不直接交互。他們通過模型互動。所以模型知道控制器和視圖,但視圖和控制器不知道彼此。 – gigadot
已經說過了。 MVC有許多變體,實際中的實際作用是不同的。 – gigadot
你是對的..,你怎麼想到在這個例子中,它的實現是更好? – pleerock