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