基于MVC架构写一个UI框架

本文介绍了MVC(Model-View-Controller)架构的概念、优缺点,并详细展示了如何在一个UI框架中实现MVC架构,包括抽象Model层、提供数据代理类、创建Controller和View组件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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框架就搭建好了,但是框架是需要用来实战才能发现问题所在的,所以这个框架雏形肯定是不完善的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值