我正在尝试使用google sample code for mvp实现MVP架构。我有一个活动,因为View有一个演示者和模型。在按钮上单击用户可以捕获并保存外部存储中的图像。在捕获点击时,我还需要播放声音。
我不确定哪个代码应该放在哪个类中,因为我无法将相机捕获并在Activity中播放声音代码(我将其视为视图)以使视图尽可能保持愚蠢而且我无法将该代码放入Presenter中因为它使用Android框架类(上下文等)。
因此,唯一的选择是将其放在模型中,但在示例代码中,模型只有存储库(我相信它只与本地/远程数据源相关)。
如何将此代码放入模型中以及如何将其与View和Presenter等其他组件相关联?任何指导方针?
答案 0 :(得分:1)
以下是解决此类问题的一种方法。
你的问题是有些代码进入演示者是有道理的,但它也是Android
y,所以你可以简单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完全分开,使您的视图仍然很愚蠢。
这些接口(及其实现)只是您的演示者用来拆分逻辑的逻辑单元/实体。我只想到"捕获"的功能。和#34; playSound"作为简单的动作,就像view.showLoading
一样,你的演示者扮演一个协调者,它会使用"某些东西"操纵视图,这是视图界面,它使用其他东西来操纵声音,这是执行此操作的界面。
如果存储库被认为是数据源,那么在我看来,这些帮助者不符合该定义。
如果您有一个实用程序来检索已捕获的图像,那么基本上可以将其视为图像的回购,但只是拍摄图像,这只是另一个动作。
您可以根据自己的需要构建/组织它们,但仅仅因为您使用的是MVP,并非您创建的每个类都必须是其中一个字母(M / V / P)。
有时,这些图层中的任何一个都需要逻辑单元的类来执行某些操作,以便您更好地分离关注点。
考虑到你有非常复杂的格式化逻辑,在除了演示者之外的单独的类中分离它是有意义的,但这是否意味着单独的类现在是模型?它可以,但它不一定是。