这是解决此类问题的一种方法。
你的问题是一些代码进入演示者是有意义的,但是它太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”来操作视图,也就是视图界面,它使用操纵声音的其他东西,这是执行此操作的界面。
如果存储库被认为是数据源,那么在我看来,这些助手不符合该定义。
如果您有一个实用程序来检索已捕获的图像,则基本上可以将其视为图像的存储库,但简单地拍摄图像只是另一种操作。
您可以根据自己的需要来组织/组织它们,但仅仅因为您使用的是 MVP,并非您创建的每个类都必须是这些字母之一 (M/V/P)。
有时这些层中的任何一个都需要逻辑单元的类来执行某些操作,以便您更好地分离关注点。
考虑到您有相当复杂的格式化逻辑,将其分隔在除演示者之外的单独类中是有意义的,但这是否意味着单独的类现在是模型?可以,但不一定。