MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。(摘自百科)
优点:
耦合性低 重用性高 可维护性高 生命周期成本低 有利软件工程化管理 部署快
缺点:
不适合小型,中等规模的应用程序 增加系统结构和实现的复杂性 视图与控制器间的过于紧密的连接 视图对模型数据的低效率访问
怎么搭建:
一:抽象Model层
public class UIBaseModel {
public int ID;
}
public class UIBaseProxy<T,T2> where T : UIBaseModel where T2 : class,new(){
//单例
protected static T2 _instance = null;
public static T2 Instance
{
get
{
if (_instance == null)
_instance = new T2();
return _instance;
}
}
//model对象表
private List<T> list = new List<T>();
//增加model
public void AddModel(T model)
{
if (model == null)
Debug.Log("UIBaseProxy : model can't be null !");
list.Add(model);
}
//通过ID取得model
public T GetModelByID(int ID)
{
foreach(var item in list)
{
if (item.ID == ID)
return item;
}
return default(T);
}
public List<T> GetModelList()
{
return list;
}
}
三:提供把问题转化为增删改查的controller
public abstract class UIBaseController {
//view
public GameObject view;
//显示
public virtual void Show()
{
if (view != null)
{
if(view.activeInHierarchy)
{
return;
}
}
view = ObjPool.Instance.OnGetObj(GetType().ToString(), "UI/UIPrefabs/");
}
//隐藏
public virtual void Hide()
{
if(view != null && view.activeInHierarchy)
{
ObjPool.Instance.OnReturnObj(view.gameObject);
}
}
//得到类型
public abstract UIDefine.UIType GetType();
}
四:提供显示结果的类
这方面就是我们具体的UI界面了,简单的例子比如:背包UI(view)得到通过controller的Show操作操作代理类查询表得到一个结果表,然后显示到背包UI上
例如下面就是一个View的例子
public class UIGameUIView : MonoBehaviour{
private Image HeadImage;
private Text NameText;
private Text HpText;
private Button bagButton;
void Awake()
{
HeadImage = transform.Find("RolePanel/HeadImage").GetComponent<Image>();
NameText = transform.Find("RolePanel/NameText").GetComponent<Text>();
HpText = transform.Find("RolePanel/HpText").GetComponent<Text>();
bagButton = transform.Find("ButtonPanel/BagButton").GetComponent<Button>();
bagButton.onClick.AddListener(OnBagButtonClick);
}
public void Show(RoleModel roleModel)
{
NameText.text = roleModel.name;
HpText.text = roleModel.currentHP + "/" + roleModel.maxHp;
}
void OnBagButtonClick()
{
UIControllerMgr.Instance.Show(UIDefine.UIType.PackUI);
}
}
完成以上步骤后我们的MVC基本模型就搭建好了,但是一个UI框架的基本操作例如显示隐藏这类的操作,肯定不能每次都去调用UI的单例Controller来操作,我们需要一个管理这些controller的类:
public class UIControllerMgr : Singleton<UIControllerMgr> {
//controller字典
public Dictionary<UIDefine.UIType, UIBaseController> controllers = new Dictionary<UIDefine.UIType, UIBaseController>();
//显示
public void Show(UIDefine.UIType type)
{
UIBaseController c;
controllers.TryGetValue(type, out c);
if(c == null)
{
c = UIDefine.GetUIBaseControllerInsByUIType(type);
if(c == null)
{
Debug.LogError("UIControllerMgr : not have " + type + " !");
}
controllers.Add(type, c);
}
c.Show();
}
//隐藏
public void Hide(UIDefine.UIType type)
{
UIBaseController c;
controllers.TryGetValue(type, out c);
if (c == null)
{
c = UIDefine.GetUIBaseControllerInsByUIType(type);
if (c == null)
{
Debug.LogError("UIControllerMgr : not have " + type + " !");
}
controllers.Add(type, c);
}
c.Hide();
}
}
然后下面是工具类:
public class UIDefine {
//UI类型
public enum UIType
{
GameUI,
PackUI
}
//通过UI类型取得controller单例
public static UIBaseController GetUIBaseControllerInsByUIType(UIType type)
{
switch(type)
{
case UIType.GameUI:
//return GameUIController.Instacne;
case UIType.PackUI:
//return PackUIController.Instacne;
}
return null;
}
}
至此,一个基于个人见解的MVC架构的UI框架就搭建好了,但是框架是需要用来实战才能发现问题所在的,所以这个框架雏形肯定是不完善的