目录
主流架构模式对比
适用场景
MVP:团队协作开发,需要高可测试性的项目
MVC架构模式制作一个简单的底部tab切换
(Model-View-Controller)结构
代码
效果
对比维度 | MVC | MVP | MVVM | MVI |
---|---|---|---|---|
学习曲线 | 最低(基础分层清晰) | 中等(需接口抽象) | 较高(依赖数据绑定框架) | 最高(状态流管理复杂) |
代码复杂度 | 低(但易导致Controller臃肿) | 中等(分层明确) | 高(双向绑定调试难度大) | 极高(单向数据流逻辑严密) |
可测试性 | 差(业务与UI耦合) | 优秀(Presenter独立测试) | 良好(ViewModel可单元测试) | 优秀(状态隔离测试友好) |
适用项目规模 | 小型原型项目(<10个页面) | 中小型项目(10-50个页面) | 中大型项目(50+页面) | 高交互复杂项目(如金融交易) |
使用率 | 传统项目遗留较多(约25%) | 企业级应用常见(约35%) | 主流框架推荐(约40%) | 新兴趋势上升(约15%) |
src/
├── main/
│ ├── java/com/ys/autoapp/
│ │ ├── MainActivity.java <-- Controller(主控制逻辑)
│ │ ├── HomeFragment.java <-- Controller(首页页面逻辑)
│ │ ├── RulesFragment.java <-- Controller(规则页面逻辑)
│ │ └── ProfileFragment.java <-- Controller(我的页面逻辑)
│ │
│ ├── res/
│ │ ├── layout/
│ │ │ ├── activity_main.xml <-- View(主界面布局)
│ │ │ ├── fragment_home.xml <-- View(首页页面)
│ │ │ ├── fragment_rules.xml <-- View(规则页面)
│ │ │ └── fragment_profile.xml <-- View(我的页面)
│ │ │
│ │ └── menu/
│ │ └── bottom_navigation_menu.xml <-- View(底部导航菜单定义)
│ │
│ └── drawable/
│ ├── ic_home.xml
│ ├── ic_rules.xml
│ └── ic_profile.xml <-- View(图标资源)
MainActivity
import android.os.Bundle;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.android.material.navigation.NavigationBarView;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
// 定义常量以替代资源 ID
private static final int NAVIGATION_HOME = R.id.navigation_home;
private static final int NAVIGATION_RULES = R.id.navigation_rules;
private static final int NAVIGATION_PROFILE = R.id.navigation_profile;
private FragmentManager fragmentManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fragmentManager = getSupportFragmentManager();
// 初始化底部导航栏
BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_navigation);
bottomNavigationView.setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(android.view.MenuItem item) {
Log.d(TAG, "切换" + String.valueOf(item.getItemId()));
Fragment selectedFragment = null;
// 使用 if-else 替代 switch-case,避免变量重复赋值
if (item.getItemId() == NAVIGATION_HOME) {
selectedFragment = new HomeFragment();
} else if (item.getItemId() == NAVIGATION_RULES) {
selectedFragment = new RulesFragment();
} else if (item.getItemId() == NAVIGATION_PROFILE) {
selectedFragment = new ProfileFragment();
}
if (selectedFragment != null) {
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.fragment_container, selectedFragment);
transaction.commit();
}
return true;
}
});
// 默认显示首页
bottomNavigationView.setSelectedItemId(NAVIGATION_HOME);
}
}
HomeFragment
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class HomeFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_home, container, false);
}
}
ProfileFragment
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class ProfileFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_profile, container, false);
}
}
RulesFragment
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class RulesFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_rules, container, false);
}
}
bottom_navigation_menu.xml
activity_main.xml
fragment_home.xml
fragment_rules.xml
fragment_profile.xml
ic_home.xml
ic_rules.xml
ic_profile.xml
人的一生 必须要学会做一件事 而且要做到透彻 才不枉此生...共勉 。