关于PureMVC的个人理解与实现

这是一个工具类可有可无,根据自己实际情况取舍

using UnityEngine;
using System.Collections;
/// <summary>
/// 获取场景中的对象[设置场景中对象]
/// </summary>
public class GameUtility
{
    /// <summary>  
    /// 获取子节点  
    /// </summary>  
    public static Transform GetChild(GameObject root, string path)
    {
        Transform tra = root.transform.Find(path);
        if (tra == null) Debug.Log(path + "not find");
        return tra;
    }
    /// <summary>  
    /// 获取子节点组件  
    /// </summary>  
    public static T GetChildComponent<T>(GameObject root, string path) where T : Component
    {
        Transform tra = root.transform.Find(path);
        if (tra == null) Debug.Log(path + "not find");
        T t = tra.GetComponent<T>();
        return t;
    }

}

NotificationConstant类是对常量的规范定义类

using UnityEngine;
using System.Collections;

/// <summary>
/// Notification常用字符串常量去表示
/// </summary>
public class NotificationConstant
{
    public const string ButtonClick = "ButtonClick";
    public const string LevelChange = "LevelChange";
    public const string RnChange = "RnChange";

}

数据定义类,依据个人需求定义

using UnityEngine;
using System.Collections;
/// <summary>
/// 数据定义
/// </summary>
public class CharacterInfo
{
    public int Level { get; set; }
    public int Rn { get; set; }
    public CharacterInfo()
    {
    }
    public CharacterInfo(int level,int rn)
    {
        Level = level;
        Rn = rn;
    }

}

PureMVC主体框架的搭建即四个继承类,TestCommand继承Simple Command[Controller],TestProxy继承Proxy[Model],TestMediator继承Mediator[View],TestFacade继承Facade,这个是中介代理,负责注册事件

using UnityEngine;
using System.Collections;

using PureMVC.Patterns;

public class TestCommand : SimpleCommand
{
     
    public new  const string NAME = "TestCommand";
    //只对ButtonClick通知拦截,由TestFacade注册的
    public override void Execute(PureMVC.Interfaces.INotification notification)
    {
        TestProxy proxy = (TestProxy)Facade.RetrieveProxy(TestProxy.NAME);
       // Debug.Log(proxy + "--" + TestProxy.NAME);
        proxy.ChangeNum(1);
    }

}

****************************************************************************************************************

using UnityEngine;
using System.Collections;
using PureMVC.Patterns;

public class TestProxy : Proxy
{
    public new const string NAME = "TestProxy";
    public CharacterInfo Data { get; set; }

    public TestProxy()
        :base(NAME )
    {
        Data = new CharacterInfo();
    }
    //执行ChangeLevel操作,并发送LevelChange通知
    //由TestMediator对每个通知进行监测,若在感兴趣的通知里
    //则拦截
    public void ChangeNum(int change)
    {
        Data.Level += change;
        SendNotification(NotificationConstant.LevelChange, Data);
        int ro = Random.Range(1, 100);
        Data.Rn = ro;
        SendNotification(NotificationConstant.RnChange, Data);
    }
}

******************************************************************************************************************

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using PureMVC.Patterns;
using UnityEngine.UI;

public class TestMediator : Mediator
{
    public new const string NAME = "TestMediator";
    //View
    private Text levelText;
    private Button levelUpButton;
    private Text rnText;
    public TestMediator(GameObject root)
       : base(NAME)
    {
        levelText = GameUtility.GetChildComponent<Text>(root, "Text/LevelText");
        levelUpButton = GameUtility.GetChildComponent<Button>(root, "LevelUpButton");
       
        rnText = GameUtility.GetChildComponent<Text>(root, "Rondom/Text");
      
        //给Button添加Onclick操作处理
        levelUpButton.onClick.AddListener(OnClickLevelUpButton);
      
    }


   
    private void OnClickLevelUpButton()
    {
        //发送ButtonClick通知,由TestCommand拦截并执行Excute方法
        SendNotification(NotificationConstant.ButtonClick);
    }
    //添加感兴趣的通知,只要有通知发出就会拿遍历list去匹配,
    //匹配到则调用下面的HandleNotification函数
    //进行处理通知
    public override IList<string> ListNotificationInterests()
    {
        IList<string> list = new List<string>();
        list.Add(NotificationConstant.LevelChange);
        list.Add(NotificationConstant.RnChange);
      
        return list;
    }
    //处理通知
    public override void HandleNotification(PureMVC.Interfaces.INotification notification)
    {
     //   Debug.Log(notification.Name);
        CharacterInfo ci = notification.Body as CharacterInfo;
        //对相应的通知做相应的处理
        switch (notification.Name)
        {  
            //对LevelChange通知处理过程
            case NotificationConstant.LevelChange:
              // CharacterInfo ci = notification.Body as CharacterInfo;
                levelText.text = ci.Level.ToString();
                break;
            case NotificationConstant.RnChange:
               // CharacterInfo c = notification.Body as CharacterInfo;
                rnText.text = ci.Rn.ToString();
                break;
           
            default:
                break;
        }
    }

}

******************************************************************************************************************

using UnityEngine;  
using System.Collections;  
using PureMVC.Patterns;
/// <summary>
/// Facade为主管
/// </summary>
public class TestFacade : Facade
{
    public TestFacade(GameObject canvas)
    {
     //   Debug.Log(canvas);
        //给TestCommand注册拦截ButtonClick通知
        RegisterCommand(NotificationConstant.ButtonClick, typeof(TestCommand));//Controller
       // RegisterCommand(NotificationConstant.ButtonClick, typeof(TestCommand));//Controller
     
        //注册中介和代理
        RegisterMediator(new TestMediator(canvas));//View
        RegisterProxy(new TestProxy());//Model
     
    }

}

框架的启动 Test类,唯一一个挂在场景中的类

using UnityEngine;
using System.Collections;
public class Test : MonoBehaviour
{
    private GameObject canvas;
    void Awake()
    {
        canvas = GameObject.Find("Canvas");
    }
    void Start()
    {
        new TestFacade(canvas );
    }

}

注意:场景中的组件就不一一细写了根据TestMediator在场景中设置如图

再来一个PureMVC结构图


相信大家都理解了,不善言辞的我会慢慢练习的。。。。。。。

猜你喜欢

转载自blog.csdn.net/qq_25122429/article/details/80492223