对于这些情况,我有额外的助手类,我称之为Formatter。我将当前状态从我的Presenter 传递给View,然后根据该状态向Formatter 询问适当的字符串。我认为一个小例子会有所帮助:
您有一个对象,它代表您希望在视图上设置的数据。我们暂时称它为State:
public class State {
private final boolean isServerString;
private final String serverString;
public State(boolean isServerString, String serverString) {
this.isServerString = isServerString;
this.serverString = serverString;
}
public boolean isServerString() {
return isServerString;
}
public String getServerString() {
return serverString;
}
}
在您Presenter 中,您可以根据需要的任何逻辑创建它并将其传递给View:
public class MessagePresenter {
private void setMessage() {
// logic here
State state = new State(true, "Hello from the server");
view().setMessage(state);
}
}
然后在您的 Activity/Fragment/ViewGroup 中,您将拥有以下内容:
public class MyActivity extends Activity implements MessageView {
private MessageFormatter formatter;
private TextView messageTextView;
@Override
public setMessage(State state) {
String message = formatter.getMessage(state);
messageTextView.setText(message);
}
}
如您所见,视图向Formatter 询问要在 TextView 中显示的字符串。格式化程序看起来像这样:
public class MessageFormatter {
private Context context;
public MessageFormatter(Context context) {
this.context = context;
}
public String getMessage(State state) {
return state.isServerString()
? state.getServerString()
: context.getString(R.string.default_message);
}
}
它需要Context 作为构造函数参数,是的,它确实有一点逻辑。然而,繁重的逻辑仍然存在于Presenter 中。大多数时候它应该只是一个简单的布尔检查。
当你创建一个Formatter 接口然后使用你的Presenter 来决定哪个 Formatter 实例化时,使用这种方法的真正威力就发挥了作用。例如,您可以创建一个HoliidayMessageFormatter 和一个DefaultMessageFormatter,这将允许您根据Presenter 中的小逻辑检查为您的应用程序提供不同的主题。