3

我想知道这是否不好;让视图了解控制器,以便它可以委托视图中发生的操作等,并让控制器了解视图(这显然是正确的),但是我想知道这是双向关系是否正确?我想在视图中引用控制器,因为我想将所有工作委托给控制器并保持视图清洁。

这是一个糟糕的设计吗?如果是这样,我可以做些什么不同的事情并仍然达到同样的效果?

控制器:

public class Controller {

    private View view;

    public Controller() {
        view = new View(this);
    }

    public void doSomeButtonAction() {
        // More code...
    }
}

看法:

public class View implements ActionListener {

    private Controller controller;
    private Button button;

    public View(Controller controller) {
        this.controller = controller;

        // Code for initializing button reference etc.
    }

    @Override
    public void actionPerformed(ActionEvent event) {
        controller.doSomeButtonAction();
    }    
}
4

5 回答 5

0

意见会有所不同,但是,我喜欢将模型设计为应用层中的顶级客户端,这意味着仅由容器(应用服务器 + 任何框架)调用,当然不是由视图或模型调用。为了清晰起见,我远离视图组件在语言级别直接与控制器对象对话,而是通过协议使其通过容器。因此,如果网页需要向 Java servlet 提供额外的请求,而不是直接调用 servlet,而是向服务器提交 HTTP(或任何其他协议)请求,并让服务器将其路由到适当的控制器组件。这样,您在 MVC 的不同组件之间就有了一个抽象层,

所以我的回答是肯定的,视图与控制器对话是不好的。事实上,我喜欢在设计 MVC 时依赖完全的控制反转,即没有组件直接访问另一个组件,而是有一个由容器管理的抽象层。

于 2013-02-28T19:20:57.640 回答
0

你有一个大致的想法:把逻辑(actionPerformed() 的实现放到控制器中。视图会有可见的小部件,例如,面板中的按钮。这对我来说不像“MVC”,而是“ VC”,看不到数据模型。

这里没有足够的代码让我称之为“坏”。

于 2013-02-28T18:47:05.490 回答
0

分配特定按钮执行的功能是视图级别的问题控制器负责提供how,但它不会向上告诉视图它的按钮应该做什么。视图可以“知道”“这是一个调用保存操作的按钮”。视图的全部目的是将人工输入转换为软件操作!

如果您想要可重用的组件,您当然可以在其中添加另一层抽象,但是分配按钮执行的操作的代码在概念上仍然是“视图”的一部分,无论您将其粘贴到何处。

于 2013-02-28T21:03:48.270 回答
0

它不是 MVC 设计,MVC 应该将模型、视图和控制器分层分离,以获得设计模式的好处。

您似乎正在使用 JSF ,因此您的 View 和 Controller 类实际上都是 JSF 中 View 层的一部分。您最好将它们重命名为 PageAction、ViewFinder、ViewFrontController 等。

于 2013-02-28T18:50:35.437 回答
0

稍后可能会派上用场的一件事是删除您Controller的构造函数中的依赖项。将视图作为参数传递或使用 setter。

public class Controller {

    private View view;

    public Controller(View view) {
        this.view = view;
    }

    public void doSomeButtonAction() {
        // More code...
    }
}

这样,您的控制器不负责创建View. 您的程序本身(例如 Main)将负责创建所需的View实现,并在创建Controller. 如果您想使用模拟视图或控制器,这也将有助于测试。

您的视图负责用户程序交互。当它接收到一些用户输入时,它需要通知一些控制器,所以你必须对它有一个引用。然后,它的字段View也应该有一个设置器。Controller通过这种方式,您可以构建两者并相互传递。

于 2013-02-28T18:43:56.020 回答