PureMVC

思考并回答以下问题:

  • MVC的目的是为了解耦合,是怎么实现解耦合的?
  • MVC的一层可以省略吗?

MVC

虚线是间接调用,进一步的解耦合的话可以把实线都变成虚线。

PureMVC

PureMVC全部是间接引用。

Controller都是命令对象。
View既要接收消息,也要发送消息。

Proxy和Mediator都需要定义本类名称。

应用

Model

PlayerData.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// 角色数据实体类
public class PlayerData
{
// 角色等级
private int level = 0;

public int Level
{
get
{
return level;
}

set
{
level = value;
}
}
}

PlayerDataProxy.cs

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
27
28
29
30
31
32
33
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using PureMVC.Patterns;

// 数据模型
public class PlayerDataProxy : Proxy
{
// 声明本类名称
// 这个名称用来给Facade查找
public new const string NAME = "PlayerDataProxy";

// 引用数据实体类
private PlayerData playerData = null;

public PlayerDataProxy() : base(NAME)
{
playerData = new PlayerData();
}

// 增加等级
public void AddLevel(int addNum)
{
playerData.Level += addNum;

// 数据发生了变化,发送给视图层
// 观察者模式
// 第一个参数是消息名称
// 把实体类发送出去,让观察者自己拉取信息
// 模型通过观察者模式告知视图
SendNotification("Msg_AddLevel", playerData);
}
}

View

PlayerDataMediator.cs

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using PureMVC.Patterns;
using UnityEngine.UI;
using PureMVC.Interfaces;

public class PlayerDataMediator : Mediator
{
// 定义本类名称
public new const string NAME = "PlayerDataMediator";
// 界面元素
private Text txt_Level;
private Button btn_AddLevel;

public PlayerDataMediator(GameObject canvas)
{
// 查找界面元素
txt_Level = canvas.transform.Find("Txt_Level").GetComponent<Text>();
btn_AddLevel = canvas.transform.Find("Btn_AddLevel").GetComponent<Button>();

// 给按钮添加监听
btn_AddLevel.onClick.AddListener(AddPlayerLevel);
}

public void AddPlayerLevel()
{
// 发送消息给控制器,让控制器处理对应逻辑
SendNotification("Reg_StartCommand");
}

// 本视图层所要监听的消息
// 注册进观察者类维护的监听者列表 ?
// 这个列表不是观察者类维护的吗?
// 怎么下降到由监听者来维护了?
// 最好的是在客户端进行监听的分配,这里由监听者自己控制要监听谁
public override IList<string> ListNotificationInterests()
{
List<string> listResult = new List<string>();
// 添加所要监听的消息
listResult.Add("Msg_AddLevel");
return listResult;
}

// 监听到消息以后所要处理的逻辑
public override void HandleNotification(INotification notification)
{
switch (notification.Name)
{
case "Msg_AddLevel":
PlayerData playData = notification.Body as PlayerData;
txt_Level.text = playData.Level.ToString();
break;

default:
break;
}
}
}

Controller

PlayerDataCommand.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using PureMVC.Patterns;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using PureMVC.Interfaces;

public class PlayerDataCommand : SimpleCommand
{

public override void Execute(INotification notification)
{
// 调用数据层里面增加等级的方法
// 通过外观模式进行查找 Retrieve:检索数据
PlayerDataProxy playDataProxy = (PlayerDataProxy)Facade.RetrieveProxy(PlayerDataProxy.NAME);
playDataProxy.AddLevel(20);

}
}

Facade

ApplicationFacade.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using PureMVC.Patterns;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ApplicationFacade : Facade
{

public ApplicationFacade(GameObject canvas)
{
// MVC三层绑定
// 注册控制层(“命令消息”与控制层的对应关系,建立绑定)
RegisterCommand("Reg_StartCommand", typeof(PlayerDataCommand));

// 注册视图层
RegisterMediator(new PlayerDataMediator(canvas));

// 注册模型层
RegisterProxy(new PlayerDataProxy());
}
}

客户端

GameStart.cs 挂载到Canvas上

1
2
3
4
5
6
7
8
9
10
11
12
13
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameStart : MonoBehaviour {

// Use this for initialization
void Start ()
{
// 启动PureMVC框架
new ApplicationFacade(this.gameObject);
}
}

分析

C# this 构造函数

我看的中介者模式只有一个中介者,这边有多个中介者一个UIPanel就是一个中介者里面的各种Text、Button都是使用这个中介者的对象

代理 中介者 命令 通过观察者模式进行通信 对客户端使用外观模式进行调用

控制器的命令模式把模型层的方法封装了 控制器是命令对象 客户端通过外观模式访问控制器间接调用模型

模型与视图 通过 观察者模式进行通信

每一个View都是中介者

观察者触发命令

观察者触发 使用代理模式的 命令

写代码的时候 是否 应用MVC 其实是否有解耦合的思想

之前省略了一层并不是知道原因 其实解耦合才是思想

0%