名词(术语)了解--架构-MVCMVVMMVP

打印 上一主题 下一主题

主题 973|帖子 973|积分 2934

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
名词(术语)了解–架构-MVC/MVVM/MVP

MVC


  • 模型(Model)

    • 负责应用程序的数据逻辑和业务规则
    • 维护数据的状态和完整性
    • 与数据库等长期化层交互
    • 不依赖于视图和控制器
    • 当数据发生变化时,关照相关的视图进行更新

  • 视图(View)

    • 负责数据的可视化展示
    • 将模型的数据出现给用户
    • 吸取用户的操纵输入
    • 可以存在多个视图展示同一个模型的数据
    • 不直接处置处罚业务逻辑

  • 控制器(Controller)

    • 作为模型和视图之间的中介
    • 处置处罚用户的交互请求
    • 更新模型的状态
    • 选择合适的视图进行展示
    • 和谐整个应用程序的工作流程

MVC的工作流程:


  • 用户通过视图界面进行操纵
  • 控制器吸取用户的请求
  • 控制器调用相应的模型进行数据处置处罚
  • 模型返回处置处罚结果给控制器
  • 控制器选择合适的视图进行展示
  • 视图更新界面表现
MVC的上风:


  • 关注点分离:每个组件负责特定的功能,使代码布局清楚
  • 代码复用:模型可以被多个视图复用
  • 并行开辟:差别团队可以同时开辟差别组件
  • 维护性好:修改某一组件不会影响其他组件
实际应用示例:

  1. # Model
  2. class UserModel:
  3.     def __init__(self):
  4.         self.name = ""
  5.         self.email = ""
  6.    
  7.     def save(self):
  8.         # 保存用户数据到数据库
  9.         pass
  10. # View
  11. class UserView:
  12.     def show_user_details(self, name, email):
  13.         print(f"User: {name}")
  14.         print(f"Email: {email}")
  15.    
  16.     def get_user_input(self):
  17.         name = input("Enter name: ")
  18.         email = input("Enter email: ")
  19.         return name, email
  20. # Controller
  21. class UserController:
  22.     def __init__(self):
  23.         self.model = UserModel()
  24.         self.view = UserView()
  25.    
  26.     def create_user(self):
  27.         name, email = self.view.get_user_input()
  28.         self.model.name = name
  29.         self.model.email = email
  30.         self.model.save()
  31.         self.view.show_user_details(name, email)
复制代码
MVC模式在现代框架中的应用:


  • Web开辟:

    • Django (Python):MTV模式(Model-Template-View,本质是MVC)
    • Spring MVC (Java)
    • Ruby on Rails:严格遵循MVC模式

  • 移动开辟:

    • iOS:Cocoa MVC
    • Android:Activity/Fragment可以看作Controller和View的组合

  • 桌面应用:

    • JavaFX
    • Windows Forms

MVVM


  • 模型(Model)

    • 代表应用程序的数据和业务逻辑
    • 包罗数据实体、数据访问层和业务规则
    • 完全独立于UI层,不知道视图和视图模型的存在
    • 示例:

  1. class UserModel {
  2.     id: number;
  3.     name: string;
  4.     email: string;
  5.     constructor(data: any) {
  6.         this.id = data.id;
  7.         this.name = data.name;
  8.         this.email = data.email;
  9.     }
  10.     async save() {
  11.         // 保存数据到服务器
  12.     }
  13. }
复制代码

  • 视图(View)

    • 负责UI的展示和用户交互
    • 通过数据绑定与ViewModel进行通讯
    • 不包罗业务逻辑
    • 示例(Vue.js):

  1. <template>
  2.   <div>
  3.     <input v-model="viewModel.userName" />
  4.     <button @click="viewModel.saveUser">保存</button>
  5.     <p>{{ viewModel.userStatus }}</p>
  6.   </div>
  7. </template>
复制代码

  • 视图模型(ViewModel)

    • 作为视图的数据源和下令源
    • 处置处罚视图的业务逻辑
    • 将模型数据转换为视图可以使用的格式
    • 管理视图状态
    • 示例:

  1. class UserViewModel {
  2.     private model: UserModel;
  3.     public userName: string = '';
  4.     public userStatus: string = '';
  5.     constructor(model: UserModel) {
  6.         this.model = model;
  7.         this.userName = model.name;
  8.     }
  9.     async saveUser() {
  10.         try {
  11.             this.userStatus = '保存中...';
  12.             await this.model.save();
  13.             this.userStatus = '保存成功';
  14.         } catch (error) {
  15.             this.userStatus = '保存失败';
  16.         }
  17.     }
  18. }
复制代码

  • 数据绑定机制

    • 单向绑定:数据从ViewModel流向View
    • 双向绑定:View和ViewModel之间的数据自动同步
    • 示例(Vue.js的响应式系统):

  1. <script setup>
  2. import { ref, computed } from 'vue'
  3. const firstName = ref('')
  4. const lastName = ref('')
  5. // 计算属性示例
  6. const fullName = computed(() => {
  7.     return firstName.value + ' ' + lastName.value
  8. })
  9. </script>
  10. <template>
  11.     <input v-model="firstName" />
  12.     <input v-model="lastName" />
  13.     <p>全名: {{ fullName }}</p>
  14. </template>
复制代码

  • MVVM的紧张特点:
a. 数据绑定



  • 自动同步数据和UI
  • 淘汰手动DOM操纵
  • 进步开辟效率
b. 下令模式

  1. // ViewModel中的命令
  2. class ViewModel {
  3.     saveCommand = {
  4.         execute: async () => {
  5.             // 执行保存操作
  6.         },
  7.         canExecute: () => {
  8.             // 判断是否可以执行
  9.             return this.isValid;
  10.         }
  11.     }
  12. }
复制代码
c. 状态管理

  1. // Vue.js中的状态管理
  2. const store = {
  3.     state: reactive({
  4.         count: 0
  5.     }),
  6.     increment() {
  7.         this.state.count++
  8.     }
  9. }
复制代码

  • 实际应用场景:
a. Vue.js中的MVVM实现:

  1. <!-- 组件示例 -->
  2. <template>
  3.     <div>
  4.         <input v-model="user.name" />
  5.         <p>{{ user.displayName }}</p>
  6.         <button @click="saveUser">保存</button>
  7.     </div>
  8. </template>
  9. <script>
  10. export default {
  11.     data() {
  12.         return {
  13.             user: {
  14.                 name: '',
  15.                 displayName: computed(() => `用户: ${this.user.name}`)
  16.             }
  17.         }
  18.     },
  19.     methods: {
  20.         saveUser() {
  21.             // 保存用户信息
  22.         }
  23.     }
  24. }
  25. </script>
复制代码
b. Angular中的MVVM实现:

  1. // 组件类
  2. @Component({
  3.     selector: 'app-user',
  4.     template: `
  5.         <input [(ngModel)]="user.name" />
  6.         <p>{{user.displayName}}</p>
  7.         <button (click)="saveUser()">保存</button>
  8.     `
  9. })
  10. class UserComponent {
  11.     user = {
  12.         name: '',
  13.         get displayName() {
  14.             return `用户: ${this.name}`;
  15.         }
  16.     };
  17.     saveUser() {
  18.         // 保存用户信息
  19.     }
  20. }
复制代码

  • MVVM的上风:


  • 更好的关注点分离
  • 更轻易进行单元测试
  • 更好的代码复用
  • 更好的可维护性
  • 低落视图和业务逻辑的耦合

  • 最佳实践:


  • 保持ViewModel的纯粹性
  • 避免在View中写业务逻辑
  • 使用计算属性处置处罚数据转换
  • 合理使用数据绑定
  • 注意性能优化
MVP


  • 模型(Model)

    • 负责数据和业务逻辑
    • 完全独立于UI层
    • 示例:

  1. class UserModel {
  2.     private id: number;
  3.     private name: string;
  4.     private email: string;
  5.     constructor(data: any) {
  6.         this.id = data.id;
  7.         this.name = data.name;
  8.         this.email = data.email;
  9.     }
  10.     async save(): Promise<boolean> {
  11.         // 保存数据到服务器
  12.         return true;
  13.     }
  14.     validate(): boolean {
  15.         return this.email.includes('@');
  16.     }
  17. }
复制代码

  • 视图(View)

    • 定义视图接口
    • 实现详细的UI展示
    • 将用户操纵委托给Presenter
    • 示例:

  1. // 视图接口
  2. interface IUserView {
  3.     setName(name: string): void;
  4.     setEmail(email: string): void;
  5.     showError(message: string): void;
  6.     showSuccess(message: string): void;
  7. }
  8. // 具体视图实现
  9. class UserView implements IUserView {
  10.     private nameElement: HTMLInputElement;
  11.     private emailElement: HTMLInputElement;
  12.     private presenter: UserPresenter;
  13.     constructor() {
  14.         this.presenter = new UserPresenter(this);
  15.         this.bindEvents();
  16.     }
  17.     private bindEvents() {
  18.         document.getElementById('saveButton')
  19.             .addEventListener('click', () => {
  20.                 this.presenter.onSaveClicked();
  21.             });
  22.     }
  23.     setName(name: string): void {
  24.         this.nameElement.value = name;
  25.     }
  26.     setEmail(email: string): void {
  27.         this.emailElement.value = email;
  28.     }
  29.     showError(message: string): void {
  30.         alert(message);
  31.     }
  32.     showSuccess(message: string): void {
  33.         alert(message);
  34.     }
  35. }
复制代码

  • 展示者(Presenter)

    • 处置处罚视图逻辑
    • 操纵Model
    • 更新View
    • 示例:

  1. class UserPresenter {
  2.     private view: IUserView;
  3.     private model: UserModel;
  4.     constructor(view: IUserView) {
  5.         this.view = view;
  6.         this.model = new UserModel({});
  7.     }
  8.     async onSaveClicked() {
  9.         if (!this.model.validate()) {
  10.             this.view.showError('数据验证失败');
  11.             return;
  12.         }
  13.         try {
  14.             const success = await this.model.save();
  15.             if (success) {
  16.                 this.view.showSuccess('保存成功');
  17.             } else {
  18.                 this.view.showError('保存失败');
  19.             }
  20.         } catch (error) {
  21.             this.view.showError('发生错误');
  22.         }
  23.     }
  24. }
复制代码

  • MVP的紧张特点:
a. 严格的分层

  1. // 视图层只负责UI展示
  2. interface IView {
  3.     render(data: any): void;
  4.     showLoading(): void;
  5.     hideLoading(): void;
  6. }
  7. // Presenter层处理业务逻辑
  8. class Presenter {
  9.     private view: IView;
  10.     private model: Model;
  11.     handleUserAction() {
  12.         this.view.showLoading();
  13.         this.model.process()
  14.             .then(data => {
  15.                 this.view.render(data);
  16.                 this.view.hideLoading();
  17.             });
  18.     }
  19. }
复制代码
b. 视图接口化

  1. // 定义视图接口
  2. interface ILoginView {
  3.     getUserName(): string;
  4.     getPassword(): string;
  5.     showError(message: string): void;
  6.     navigateToHome(): void;
  7. }
  8. // 实现视图接口
  9. class LoginActivity implements ILoginView {
  10.     private presenter: LoginPresenter;
  11.     constructor() {
  12.         this.presenter = new LoginPresenter(this);
  13.     }
  14.     getUserName(): string {
  15.         return document.getElementById('username').value;
  16.     }
  17.     getPassword(): string {
  18.         return document.getElementById('password').value;
  19.     }
  20.     showError(message: string): void {
  21.         // 显示错误信息
  22.     }
  23.     navigateToHome(): void {
  24.         // 导航到主页
  25.     }
  26. }
复制代码

  • 实际应用示例:
a. Android中的MVP实现:

  1. // View接口
  2. interface MainView {
  3.     fun showProgress()
  4.     fun hideProgress()
  5.     fun setItems(items: List<String>)
  6. }
  7. // Presenter
  8. class MainPresenter(private val view: MainView) {
  9.     private val model = MainModel()
  10.     fun loadItems() {
  11.         view.showProgress()
  12.         model.getItems { items ->
  13.             view.hideProgress()
  14.             view.setItems(items)
  15.         }
  16.     }
  17. }
  18. // Activity实现View接口
  19. class MainActivity : AppCompatActivity(), MainView {
  20.     private lateinit var presenter: MainPresenter
  21.     override fun onCreate(savedInstanceState: Bundle?) {
  22.         super.onCreate(savedInstanceState)
  23.         presenter = MainPresenter(this)
  24.         presenter.loadItems()
  25.     }
  26.     override fun showProgress() {
  27.         progressBar.visibility = View.VISIBLE
  28.     }
  29.     override fun hideProgress() {
  30.         progressBar.visibility = View.GONE
  31.     }
  32.     override fun setItems(items: List<String>) {
  33.         // 更新UI
  34.     }
  35. }
复制代码
b. Web应用中的MVP实现:

  1. // View接口
  2. interface IProductView {
  3.     displayProducts(products: Product[]): void;
  4.     showLoadingIndicator(): void;
  5.     hideLoadingIndicator(): void;
  6. }
  7. // Presenter
  8. class ProductPresenter {
  9.     constructor(
  10.         private view: IProductView,
  11.         private model: ProductModel
  12.     ) {}
  13.     async loadProducts() {
  14.         this.view.showLoadingIndicator();
  15.         try {
  16.             const products = await this.model.getProducts();
  17.             this.view.displayProducts(products);
  18.         } finally {
  19.             this.view.hideLoadingIndicator();
  20.         }
  21.     }
  22. }
  23. // View实现
  24. class ProductPage implements IProductView {
  25.     private presenter: ProductPresenter;
  26.     constructor() {
  27.         this.presenter = new ProductPresenter(this, new ProductModel());
  28.     }
  29.     displayProducts(products: Product[]): void {
  30.         // 渲染产品列表
  31.     }
  32.     showLoadingIndicator(): void {
  33.         // 显示加载指示器
  34.     }
  35.     hideLoadingIndicator(): void {
  36.         // 隐藏加载指示器
  37.     }
  38. }
复制代码

  • MVP的上风:


  • 关注点分离更彻底
  • 视图可以轻易替换
  • 便于单元测试
  • 业务逻辑可复用
  • 维护性更好

  • 最佳实践:


  • 保持View的简单性
  • Presenter不应该包罗Android/iOS等平台特定代码
  • 使用接口定义View和Presenter的交互左券
  • 避免在Presenter中直接操纵UI元素
  • 合理处置处罚View的生命周期

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大连全瓷种植牙齿制作中心

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表