采用合约分包模式+Base类抽取方案:
public interface UserContract {
interface View {
void showLoading();
void hideLoading();
void showUserInfo(User user);
void showError(String message);
}
interface Presenter {
void attachView(View view);
void detachView();
void loadUserData(int userId);
}
interface Model {
interface OnDataCallback {
void onSuccess(User user);
void onFailure(Exception e);
}
void fetchUser(int userId, OnDataCallback callback);
}
}
UserContract.java
已完成
用户模块合约集中管理三层接口定义
abstract class BasePresenter<V> {
protected V view;
public void attachView(V view) {
this.view = view;
}
public void detachView() {
this.view = null;
}
protected boolean isViewAttached() {
return view != null;
}
}
BasePresenter.java
已完成
基础Presenter处理视图绑定和生命周期
public class UserPresenterImpl extends BasePresenter<UserContract.View>
implements UserContract.Presenter {
private final UserContract.Model model;
public UserPresenterImpl(UserContract.Model model) {
this.model = model;
}
@Override
public void loadUserData(int userId) {
if(isViewAttached()) view.showLoading();
model.fetchUser(userId, new UserContract.Model.OnDataCallback() {
@Override
public void onSuccess(User user) {
if(isViewAttached()) {
view.hideLoading();
view.showUserInfo(user);
}
}
@Override
public void onFailure(Exception e) {
if(isViewAttached()) {
view.hideLoading();
view.showError(e.getMessage());
}
}
});
}
}
UserPresenterImpl.java
已完成
具体业务Presenter继承基类并实现合约接口
class UserModelImpl implements UserContract.Model {
@Override
public void fetchUser(int userId, OnDataCallback callback) {
// 模拟网络请求
new Thread(() -> {
try {
Thread.sleep(1000);
if(userId == 1) {
callback.onSuccess(new User("张三", 25));
} else {
throw new Exception("用户不存在");
}
} catch (Exception e) {
callback.onFailure(e);
}
}).start();
}
}
UserModelImpl.java
已完成
Model层实现数据获取逻辑
class UserActivity extends AppCompatActivity
implements UserContract.View {
private UserContract.Presenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user);
presenter = new UserPresenterImpl(new UserModelImpl());
presenter.attachView(this);
presenter.loadUserData(1);
}
@Override
public void showLoading() {
ProgressDialog.show(this, "", "加载中...");
}
@Override
public void showUserInfo(User user) {
TextView tvName = findViewById(R.id.tv_name);
tvName.setText(user.getName());
}
}
UserActivity.java
已完成
Activity作为View层实现合约接口
该方案通过合约接口规范模块交互,Base类抽取通用逻辑,每个功能模块只需维护1个合约文件+3个实现类。建议项目结构按功能分包(如user/ news/),每个包内包含contract/ model/ presenter/ view子目录。