Android开发采用MVP模式时避免类爆炸方案

69 阅读1分钟

采用合约分包模式+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子目录。