Android常见三种设计架构

MVC(Model-View-Controller)

1. 组件角色
  • 模型(Model)
    • 负责处理数据和业务逻辑,如数据的存储、检索、验证等。
  • 视图(View)
    • 负责展示数据给用户,通常是通过界面元素来呈现。
  • 控制器(Controller)
    • 作为模型和视图之间的桥梁,接收用户输入,处理请求,并调用模型和视图完成相应的操作。
2. 交互方式
  • 视图通常可以直接访问模型来获取数据,但直接访问可能会增加视图和模型之间的耦合度。
  • 控制器负责处理用户输入,并根据需要调用模型和视图。
3. 特点
  • 强调关注点分离,即模型、视图和控制器各自承担不同的职责。
  • 有助于提高应用程序的可维护性、可扩展性和可重用性。
  • 视图直接访问模型可能导致较高的耦合度,增加测试和维护的难度。
具体业务场景示例
  • 在线购物网站
    • 用户浏览商品列表(View)。
    • 点击购买按钮(Controller)后,商品信息被发送到服务器(通过Model处理)。
    • 更新购物车视图(View)。
  • 博客系统
    • 用户通过表单(View)提交文章。
    • 控制器(Controller)接收输入,调用模型(Model)处理数据(如验证、存储)。
    • 成功后更新文章列表视图(View)。

MVP(Model-View-Presenter)

1. 组件角色
  • 模型(Model)
    • 负责处理数据和业务逻辑。
  • 视图(View)
    • 负责展示数据给用户,但不直接访问模型。
  • 演示者(Presenter)
    • 替代MVC中的控制器,负责处理视图和模型之间的交互。
2. 交互方式
  • 视图和模型完全不通信,所有交互都通过Presenter进行。
  • 视图将用户输入传递给Presenter,Presenter调用模型处理数据,并更新视图以显示结果。
3. 特点
  • 通过Presenter层进一步降低视图和模型之间的耦合度,使依赖关系更松散。
  • 提高应用程序的可测试性和可维护性,便于编写单元测试。
  • 视图是被动角色,不主动从模型获取数据或更新显示,而是等待Presenter的指令。
具体业务场景示例
  • 游戏应用
    • 复杂的用户交互和实时数据处理,Presenter使游戏逻辑独立于游戏界面进行开发和测试。
  • 复杂表单应用
    • Presenter封装所有表单相关逻辑,视图只需展示数据和接收用户输入。

MVVM(Model-View-ViewModel)

组件角色
  • 模型(Model)
    • 处理数据逻辑。
  • 视图(View)
    • 负责显示数据,并能自动响应数据变化。
  • ViewModel
    • 作为视图和模型之间的桥梁,实现双向数据绑定。
特点
  • 双向数据绑定
    • 模型数据变化时视图自动更新,视图数据变化时模型也相应更新。
  • 命令模式
    • 处理用户交互,将操作封装为命令对象并与ViewModel绑定。
  • 高内聚低耦合
    • 视图和模型完全解耦,但双向数据绑定使交互更加紧密高效。
具体业务场景示例
  • 实时数据监控应用
    • ViewModel从数据源获取数据并更新模型,视图通过数据绑定自动展示最新数据。
  • 表单验证和编辑应用
    • ViewModel处理表单数据的验证和编辑逻辑,通过双向数据绑定自动同步更改到视图和模型。
  • 移动端应用
    • 在Android和iOS开发中,结合数据绑定库(如LiveData、Data Binding)简化界面更新逻辑,提高开发效率和响应速度。

实现示例

1. MVC (Model-View-Controller)

应用场景:简单的应用,视图和控制器职责明确。

伪代码

// Model
class UserModel {
    
    
    private String name;
    // getters and setters
}

// View (interface)
interface UserView {
    
    
    void updateName(String name);
}

// Controller
class UserController implements UserView.OnClickListener {
    
    
    private UserModel model;
    private UserView view;

    UserController(UserModel model, UserView view) {
    
    
        this.model = model;
        this.view = view;
        view.setOnClickListener(this);
    }

    @Override
    public void onClick() {
    
    
        // 处理用户点击事件,更新Model
        model.setName("New Name");
        // 通知View更新
        view.updateName(model.getName());
    }
}
2. MVP (Model-View-Presenter)

应用场景:复杂UI逻辑和大量业务逻辑的应用,需提高可测试性和可维护性。

伪代码

// Model
class UserModel {
    
    
    // ... 同MVC
}

// View (interface)
interface UserView {
    
    
    void setName(String name);
    void showError(String message);
}

// Presenter
class UserPresenter {
    
    
    private UserModel model;
    private UserView view;

    UserPresenter(UserModel model, UserView view) {
    
    
        this.model = model;
        this.view = view;
    }

    public void loadData() {
    
    
        // 模拟数据加载
        String name = model.getName(); // 可能来自网络请求
        if (name != null) {
    
    
            view.setName(name);
        } else {
    
    
            view.showError("Error loading data");
        }
    }
}
3. MVVM (Model-View-ViewModel)

应用场景:数据驱动的应用,如响应式UI,双向数据绑定等。

伪代码(注意:MVVM在Android中通常与数据绑定库如Data Binding或第三方库如LiveData, ViewModel等结合使用)

// Model
// ... 同MVC

// ViewModel
class UserViewModel extends ViewModel {
    
    
    private MutableLiveData<String> name = new MutableLiveData<>();

    public LiveData<String> getName() {
    
    
        return name;
    }

    public void setName(String newName) {
    
    
        name.setValue(newName);
    }

    // 假设有一个方法从数据源加载数据
    public void loadData() {
    
    
        // 模拟数据加载
        String loadedName = "Loaded Name"; // 可能来自网络请求
        setName(loadedName);
    }
}

// View (Activity/Fragment)
// 在这里,View会观察ViewModel中的数据变化,并自动更新UI
// 伪代码省略了具体的观察和数据绑定代码

猜你喜欢

转载自blog.csdn.net/qq_36329049/article/details/142502595