0

我正在尝试使用mvp 的谷歌示例代码来实现 MVP 架构。我有一个作为 View 的活动,它有一个演示者和模型。单击按钮后,用户可以捕获图像并将其保存在外部存储中。在捕获点击时,我还需要播放声音。

我不确定应该将哪个代码放在哪个类中,因为我无法将相机捕获和播放声音代码放在 Activity(我将其视为视图)中以使视图尽可能地哑,并且我不能将该代码放在 Presenter 中,因为它使用Android 框架类(上下文等)。

因此,唯一的选择是将其放入模型中,但在示例代码中,模型只有存储库(我认为它仅与本地/远程数据源相关)。

如何将此代码放入模型中以及如何将其与 View 和 Presenter 等其他组件链接?有什么指导方针吗?

4

1 回答 1

1

这是解决此类问题的一种方法。

你的问题是一些代码进入演示者是有意义的,但是它太Androidy,所以你可以简单地interface绕过它。

您基本上需要的是可以完成某些功能的两件事。

interface CapturingSoundPlayer {
    void playSound();
}

interface ImageCapturer {
    void captureImage();
}

请注意,名称和方法签名取决于您和您的需要,我只是用它们来说明一点。

现在,您的应用程序将这两个接口作为依赖项是完全安全的,它们与 Android 无关,我们只是将技术排除在外,只留下行为。

您需要将这些依赖项传递给您的演示者并在需要时使用它们。

class Presenter {
    private final CapturingSoundPlayer soundPlayer;
    private final ImageCapturer capturer;

    Presenter(CapturingSoundPlayer soundPlayer, ImageCapturer capturer) {
        this.soundPlayer = soundPlayer;
        this.capturer = capturer;
    }

    void onCaptureButtonClicked() {
        soundPlayer.playSound();
        capturer.captureImage();
    }
}

现在这些接口的实现可以与你的 Activity 完全分开,让你的视图仍然很愚蠢。

这些接口(及其实现)只是演示者用来拆分逻辑的逻辑单元/实体。我只是简单的把“capture”和“playSound”的功能看成是简单的动作,就像view.showLoading,你的presenter扮演一个orchestrator,它用“something”来操作view,也就是view interface,它用其他的东西来操作操纵声音,这是执行此操作的界面。

如果存储库被认为是数据源,那么我认为这些助手不符合该定义。

如果您有一个实用程序来检索已捕获的图像,则基本上可以将其视为图像的存储库,但简单地拍摄图像只是另一种操作。

您可以根据自己的需要组织/组织它们,但仅仅因为您使用的是 MVP,并非您创建的每个类都必须是这些字母中的一个(M/V/P)。

有时,这些层中的任何一个都需要逻辑单元的类来执行某些操作,以便您更好地分离关注点。

考虑到您有相当复杂的格式化逻辑,将其分隔在除演示者之外的单独类中是有意义的,但这是否意味着单独的类现在是模型?可以,但不必如此。

于 2017-12-11T13:13:13.793 回答