UMVCSL4——主面板View和Mediator

本章代码关键字

1
2
3
4
5
6
7
8
9
10
11
12
Mediator                      //Mediator基类,任何在PureMVC内作为Mediator中介的类都应该继承该类,可以实现对其关联ViewUI界面的操作
mediator.Name //字符串常量,其派生类里可以覆盖该Name,使用自己的字符串作为名字
mediator.ViewComponent //该Mediator派生类对象关联的View类对象
Mediator() //Mediator的构造函数,继承该类必须要声明构造函数调用该构造函数,用于初始化名字和关联的对象

string[] ListNotificationInterests() { } //Mediator要监听哪些通知的方法,返回要监听的通知字符串数组
HandleNotification(INotification notification) { } //监听到ListNotificationInterests()返回的通知会执行的方法
OnRegister() //注册时执行的方法

INotification //监听到通知后传入的参数,其中包含重要属性
notification.Name //监听到的通知名
notification.Body //通知者上传的内容

View

即界面类,就是管理各个UI控件的类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using UnityEngine;
using UnityEngine.UI;

public class NewMainView : MonoBehaviour
{
//找控件
public Text txtName;
public Text txtLev;
public Text txtMoney;
public Text txtGem;
public Text txtPower;

public Button btnRole;

//可以选择是否向外部提供数据更新方法
//按照MVC的思想,可以直接在这里提供 更新的方法
//如果按照MVP的思想,该方法就没必要写
public void UpdateInfo(PlayerDataObject data)
{
txtName.text = data.playerName;
txtLev.text = "LV." + data.lev.ToString();
txtMoney.text = data.money.ToString();
txtGem.text = data.gem.ToString();
txtPower.text = data.power.ToString();
}
}

Mediator

界面中介类,类似于Model和Proxy之间的关系,Mediator负责处理界面逻辑

界面中介类有套路的写法

  1. 继承PureMVC中的Mediator​脚本
  2. 写构造函数
  3. 重写要监听哪些通知的方法(重要)
  4. 重写监听到处理通知的方法(重要)
  5. 可选:重写注册时的方法

其中3,4步非常重要,前者决定要监听哪些通知名,后者决定监听到前者指定的通知后要做什么

  1. 继承PureMVC中的Mediator​脚本

    1
    public class NewMainViewMediator : Mediator { }
  2. 写构造函数

    和Proxy​一样,继承了Mediator​的派生类需要声明构造函数并调用构造函数传入mediatorName

    1
    2
    3
    4
    5
    6
    //Mediator的构造函数在形式与作用上都与Proxy基类相似,这里不再多余阐述其用法
    public Mediator(string mediatorName, object viewComponent = null)
    {
    MediatorName = mediatorName ?? NAME;
    ViewComponent = viewComponent;
    }

    因此,这里我们采用和Proxy构造函数差不多的写法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //这里显式的将父类的NAME隐藏了,因此再调用NewMainViewMediator.NAME得到的将是这里的名字
    public static new string NAME = "NewMainViewMediator";

    // 2.写构造函数
    public NewMainViewMediator() : base(NAME)
    {
    //这里面是可以去创建界面预设体等逻辑
    //但是界面显示应该是被触发控制的
    //而且创建界面的代码重复性比较高
    }
  3. 重写要监听哪些通知的方法(重要)

    这是一个PureMVC的规则,就是你需要监听哪些通知,那就在这里把通知们通过字符串数组的形式返回出去
    PureMVC就会帮助我们监听这些通知,类似于 通过事件名 注册事件监听

    简单来说,就是要监听哪些通知,该方法就返回哪些通知名

    这里就会体现通知类的用处,要使用哪些通知就在通知类里声明一个字符串常量

    1
    2
    3
    4
    5
    6
    7
    8
    9
    public override string[] ListNotificationInterests()
    {
    //这是一个PureMVC的规则
    //就是你需要监听哪些通知,那就在这里吧通知们通过字符串数组的形式返回出去
    //PureMVC就会帮助我们监听这些通知
    //类似于 通过事件名 注册事件监听
    return new string[] { PureNotification.UPDATE_PLAYER_INFO };
    //如果要监听别的通知,就在字符串数组后面在添加通知名即可
    }
  4. 重写处理通知的方法

    你在ListNotificationInterests()​返回了哪些通知名,这里就可以执行监听到通知后执行的逻辑
    该方法的参数是INotification​,该接口内有两个重要信息

    1. 通知名 我们根据这个名字 来做对应的处理
    2. 通知包含的信息(类似于事件中心触发者发送给监听者的对象)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // 4.重写处理通知的方法
    public override void HandleNotification(INotification notification)
    {
    //INotification 对象 里面包含两个对我们来说 重要的参数
    //1. 通知名 我们根据这个名字 来做对应的处理
    //2. 通知包含的信息
    switch (notification.Name)
    {
    //和上面的ListNotificationInterests返回的字符串对应,这里就是如果监听到对应字符串处理相应的逻辑
    case PureNotification.UPDATE_PLAYER_INFO:
    (ViewComponent as NewMainView).UpdateInfo(notification.Body as PlayerDataObject);
    break;
    }
    }
  5. 可选:重写注册时的方法

    1
    2
    3
    4
    5
    public override void OnRegister()
    {
    base.OnRegister();
    //注册时初始化一些内容
    }