隐藏

c#unity框架设计中MVVM 的介绍,应用及优缺点

发布:2023/9/13 10:16:55作者:管理员 来源:本站 浏览次数:582

介绍


MVVM(Model-View-ViewModel)是一种架构模式,用于将应用程序分离为三个部分:


   Model(模型):负责处理应用程序的数据和业务逻辑。

   View(视图):负责呈现用户界面并处理用户交互。

   ViewModel(视图模型):作为Model和View之间的中介,处理View的显示逻辑和用户交互,并将这些操作转换为Model可用的操作。


在MVVM中,View是完全独立于Model的,ViewModel则是连接View和Model的桥梁。View通过ViewModel访问Model中的数据和方法,ViewModel则将Model中的数据和方法转换为View中可用的形式。ViewModel还可以控制View的显示逻辑和用户交互,以使View更加易于维护和扩展


在实际应用中,MVVM可以用于各种类型的应用程序,包括Web应用程序、桌面应用程序和移动应用程序等。

在unity的应用实例


一个简单的登录功能为例,说明MVVM的应用:


   Model层

   在Model层,我们定义了一个User类,用于存储用户的信息,包括用户名和密码等:



public class User

{

   public string UserName { get; set; }

   public string Password { get; set; }

}


  


   View层

   在View层,我们使用Unity提供的UI组件,构建一个简单的登录界面,并与ViewModel进行绑定,以实现双向数据绑定。代码如下:



public class LoginView : MonoBehaviour

{

   public InputField usernameInput;

   public InputField passwordInput;

   public Button loginButton;


   private LoginViewModel viewModel;


   private void Awake()

   {

       viewModel = new LoginViewModel();

       viewModel.UserName = "";

       viewModel.Password = "";

       viewModel.LoginCommand = new Command(Login);


       usernameInput.onValueChanged.AddListener(value =>

       {

           viewModel.UserName = value;

       });


       passwordInput.onValueChanged.AddListener(value =>

       {

           viewModel.Password = value;

       });


       loginButton.onClick.AddListener(() =>

       {

           viewModel.LoginCommand.Execute(null);

       });

   }


   private void Login()

   {

       if (viewModel.ValidateUser())

       {

           Debug.Log("Login succeeded");

       }

       else

       {

           Debug.Log("Login failed");

       }

   }

}


 


在View层中,我们定义了一个LoginView类,它包含了登录界面上的UI组件,如输入框和按钮等。在Awake()函数中,我们创建了一个LoginViewModel对象,并将其与UI组件进行绑定。这里使用了Unity中的事件监听器,以实现双向数据绑定。在Login()函数中,我们调用LoginViewModel中的ValidateUser()方法,用于验证用户输入的用户名和密码是否正确。


   ViewModel层

   在ViewModel层,我们创建了一个LoginViewModel类,它继承自INotifyPropertyChanged接口,用于实现双向数据绑定。代码如下:



public class LoginViewModel : INotifyPropertyChanged

{

   private User user;


   public string UserName

   {

       get { return user.UserName; }

       set

       {

           user.UserName = value;

           OnPropertyChanged(nameof(UserName));

       }

   }


   public string Password

   {

       get { return user.Password; }

       set

       {

           user.Password = value;

           OnPropertyChanged(nameof(Password));

       }

   }


   public Command LoginCommand { get; set; }


   public LoginViewModel()

   {

       user = new User();

   }


   public bool ValidateUser()

   {

       // validate user logic

       return true;

   }


   public event PropertyChangedEventHandler PropertyChanged;


   private void OnPropertyChanged(string propertyName)

   {

       PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

   }

}


 


在LoginViewModel类中,我们定义了一个User对象,用于存储用户输入的用户名和密码。在UserName和Password属性中,我们实现了INotifyPropertyChanged接口,以实现双向数据绑定。在LoginCommand属性中,我们定义了一个Command对象,用于实现登录功能。在ValidateUser()方法中,我们定义了验证用户的逻辑。


和MVC对比优缺点:

MVVM和MVC的主要区别在于ViewModel的存在,它在View和Model之间起到了一个桥梁的作用,负责把Model中的数据转化为View需要的数据格式,并且在View中用户交互的操作会通过ViewModel传递到Model中进行相应的处理,最后再将Model的数据更新到View上。


MVVM的优点:


1.松耦合:MVVM是通过数据绑定实现的,View和ViewModel之间没有直接的耦合,View只负责展示数据,ViewModel负责处理数据和业务逻辑,而不需要和View直接交互。


2.可维护性:ViewModel中的业务逻辑和数据处理可以进行单元测试,使得代码更加可维护和易于扩展。


3.可重用性:ViewModel中的逻辑和处理是独立于View的,因此可以在多个View中重用同一个ViewModel。


4.可扩展性:由于ViewModel的存在,当应用需要增加新的功能时,可以在ViewModel中进行相应的处理而不需要修改View和Model的代码。


MVVM的缺点:


1.学习曲线:相对于MVC来说,MVVM需要掌握更多的技术和知识,比如数据绑定、命令绑定等。


2.性能问题:由于MVVM中使用了数据绑定,因此在处理大量数据时可能会影响性能。


3.过度设计:有时候为了实现MVVM的松耦合和可维护性,可能会导致代码过度设计,增加了代码的复杂性。


总的来说,MVVM相对于MVC来说,更加适合大型复杂的应用程序,能够提高代码的可维护性和可重用性。但是对于小型应用程序来说,MVVM可能会增加代码的复杂度和开发成本。