UMVCSL6——Facade和Command

本章代码关键字

1
2
3
4
5
6
Facade                        //Facade基类,任何在PureMVC内作为Facade的类都应该继承该类,可以实现对PureMVC内框架下所有对象的管理
facade.RegisterCommand() //注册命令,将通知和命令绑定在一起
facade.SendNotification() //发送通知,触发监听该通知的命令和Mediator
InitializeController() { } //初始化控制层内容,这里应当为所有的Command命令进行注册
SimpleCommand //即单个命令类,所有只负责一个业务且作为Command的类,应当继承该类,他必须要在Facade里注册并于通知绑定
Execute() { } //当接收到绑定的通知后要执行的方法

Facade

Facade是PureMVC非常重要的内容,它管理了PureMVC框架下的Model,View,Controller对象
而在Model,View,Controller对象之下,就是各个Proxy,Mediator,Command的,因此可以说Facade是PureMVC的总管理者

Facade也有套路写法

  1. 继承PureMVC中的Facade脚本
  2. 为了方便使用Facade 我们需要自己写一个单例模式的属性
  3. 初始化 控制层相关的内容
  4. 必须定义一个启动函数

第一步:项目里作为架构内Facade的类需要继承Facade​基类

1
public class GameFacade : Facade { }

第二步:其次,我们需要自己写一个单例模式的属性,
Facade​基类的定义里,已经声明了一个instance​对象,
但由于基类内的GetInstance​方法需要传入Func<IFacade>​参数(用于初始化对象),且返回的是IFacade
因此实现自己的调用单例的属性更好

Facade​基类内的GetInstance​方法和instance​对象:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Facade : IFacade
{
public static IFacade GetInstance(Func<IFacade> facadeFunc)
{
if (instance == null)
{
instance = facadeFunc();
}
return instance;
}

protected static IFacade instance;
}

自己实现的调用单例的属性:

1
2
3
4
5
6
7
sing PureMVC.Patterns.Facade;

public class GameFacade : Facade
{
//2.为了方便使用Facade 我们需要自己写一个单例模式的属性 ??= 是空赋值运算符,当instance为null时,执行运算符后面的表达式
public static GameFacade Instance => (instance ??= new GameFacade()) as GameFacade;
}

在Facade内,有这三个成员变量

1
2
3
4
5
6
public class Facade : IFacade
{
protected IController controller;
protected IModel model;
protected IView view;
}

而PureMVC的Model​,View​,Controller​都继承了各自的接口,Facade就通过这三个接口成员变量管理Model,View,Controller对象

1
2
3
public class Controller: IController { }
public class Model: IModel { }
public class View: IView { }

Facade​基类内,有很多方法,其中有的方法我们必须要用
例如第三步的重写InitializeController()​初始化控制层方法,其实也有InitializeModel()​和InitializeView()​的方法

而游戏启动,初始化控制层内容是必不可少的,所以我们必须要重写InitializeController()

1
2
3
4
5
6
7
//3.初始化 控制层相关的内容
protected override void InitializeController()
{
//在基类里该方法调用并初始化了Control单例,因此必须保留
base.InitializeController();
//这里面要写一些 关于 命令(即command)和通知 绑定的逻辑
}

通知我们已经知道就是字符串,通过字符串来让Mediator来监听并触发执行方法
但是命令(即command)我们这里还不知道,我们需要先需要先写一个命令(command)
同时,我们需要在写一个与该命令对应的通知名

1
2
3
4
public class PureNotification
{
public const string START_UP = "startUp";
}

现在有了命令与通知,就需要进行注册绑定了
使用RegisterCommand()​方法,传入通知字符串和一个返回Icommand​对象的方法(也就是返回要执行的命令类对象)

1
2
3
4
5
6
protected override void InitializeController()
{
base.InitializeController();
//这里面要写一些 关于 命令和通知 绑定的逻辑
RegisterCommand(PureNotification.START_UP, () => { return new StartUpCommand(); });
}

完成这次绑定后,只要以后发送了注册时传入的通知,就会执行与之绑定的命名类的执行函数Execute()

第四步:我们必须在Facade​类里自己定义一个启动函数
我们需要调用SendNotification()​来发送通知,发送在第三步的RegisterCommand()​里绑定命令的通知,就会执行其绑定的Command​的​Execute()

1
2
3
4
5
6
//4.必须定义一个启动函数
public void StartUp()
{
//发送通知,发送通知时可以传入object参数,供监听者调用这个object,就像事件中心那样
SendNotification(PureNotification.START_UP);
}

之后,在其他类执行GameFacade.Instance.StartUp();
即可发现其执行了StartUpCommand​的Execute()​方法

image

以上即Facade和Command的简单使用方法,这是非常重要的知识,我们通过这些知识将PureMVC内的一切串联起来

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
using PureMVC.Patterns.Facade;

public class GameFacade : Facade
{
//套路写法
//1.继承PureMVC中的Facade脚本
//2.为了方便使用Facade 我们需要自己写一个单例模式的属性
//3.初始化 控制层相关的内容
//4.必须定义一个启动函数

//2.为了方便使用Facade 我们需要自己写一个单例模式的属性 ??= 是空赋值运算符,当instance为null时,执行运算符后面的表达式
public static GameFacade Instance => (instance ??= new GameFacade()) as GameFacade;

//3.初始化 控制层相关的内容
protected override void InitializeController()
{
base.InitializeController();
//这里面要写一些 关于 命令和通知 绑定的逻辑
RegisterCommand(PureNotification.START_UP, () => { return new StartUpCommand(); });
}

//4.必须定义一个启动函数
public void StartUp()
{
//发送通知,发送通知时可以传入object参数,供监听者调用这个object,就像事件中心那样
SendNotification(PureNotification.START_UP);
}
}

Command

Command即命令类,被执行时,就会执行其内部的Execute​方法

Command类的套路写法很简单

  1. 继承Command相关的基类,这里就一个命令,因此继承SimpleCommand​基类
  2. 重写里面的执行函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using PureMVC.Interfaces;
using PureMVC.Patterns.Command;
using UnityEngine;

public class StartUpCommand : SimpleCommand
{
//1.继承Command相关的基类
//2.重写里面的执行函数

//2.重写里面的执行函数
public override void Execute(INotification notification)
{
base.Execute(notification);
//当命令被执行时,就会调用该方法
Debug.Log("StartUp!");
}
}

这个Execute()​方法的参数,很明显是和在Mediator​内的ListNotificationInterests()​的参数是一样的类型,而该参数类型包含两个重要信息

  1. 通知名 我们根据这个名字 来做对应的处理
  2. 通知包含的信息(类似于事件中心触发者发送给监听者的对象)