我们在贫血模型和充血模型以及最佳实践里面演示过它们具体的概念:

充血模型是当查询一个数据的时候,返回的数据不多不少刚好是想要的数据。

贫血模型是当查询一个数据的时候,返回的数据可能比想要得多,或者比想要得少。

我们看一下MaxBulletQuery

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using FrameWorkDesign;

namespace ShootingEditor2D
{
public class MaxBulletCountQuery : AbstractQuery<int>
{
private readonly string mGunName;

public MaxBulletCountQuery(string gunName)
{
mGunName = gunName;
}
protected override int OnDo()
{
var gunConfigModel = this.GetModel<IGunConfigModel>();
var gunItem = gunConfigModel.GetItemByName(mGunName);
return gunItem.BulletMaxCount;
}
}
}

它本身的职责非常简单,就是获取弹夹容量,查询的结果就是弹夹容量的数据。在调用的位置也是用来查询容量的

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

namespace ShootingEditor2D
{
public class UIController : MonoBehaviour,IController
{
//...
private int m_MaxBulletCount;

private void Awake()
{
//...

m_MaxBulletCount = this.SendQuery(new MaxBulletCountQuery(m_GunSystem.CurrentGun.Name.Value));
}

//...


}
}

Query就是遵循充血模型的设计,每个Query类都相当于把某个表现层想用的东西包好的一个包裹,想用的时候就送过来。

Query的优点

Query封装了查询相关的代码,所以所有需要复合查询的代码都可以扔到一个Query中,这一点与Command一样,Command里面可以包含很多与交互逻辑相关的代码,而Query也可以包装任何查询相关的代码。

另外Query是可以复用的,我们在之前知道Command是可以发送Command的,同理Query可以调用Query,一些通用的查询代码,可以写到下层Query里,然后更上层的Query可以调用下层的Query

我们在贫血模型和充血模型以及最佳实践提到过充血模型的三种最佳实践,但我们引入Query之后,这三种实践用到的地方可能比较少了,但是要知道Query和这三种实践的原理都是一样的,后面我们都会应用到