引用计数使用场景:
有一间黑色的屋子,里边有一盏灯。当第一个人进屋的时候灯会打开,之后进来的人则不用再次打开了,因为已经打开过了。当屋子里所有人都离开了的时候,灯则会关闭。
引用计数器工具 :
namespace QFramework
{
public interface IRefCount
{
int RefCount { get; }
void Retain(object refOwner = null);
void Release(object refOwner = null);
}
public class SimpleRC : IRefCount
{
public int RefCount { get; private set; }
public void Retain(object refOwner = null)
{
RefCount++;
}
public void Release(object refOwner = null)
{
RefCount--;
if(RefCount == 0)
{
OnZeroRef();
}
}
protected virtual void OnZeroRef()
{
}
}
}
举例实现:
using UnityEngine;
namespace QFramework
{
public class SimpleRCExample : MonoBehaviour
{
#if UNITY_EDITOR
[UnityEditor.MenuItem("QFramework/Example/22.SimpleRCExample", false, 22)]
static void MenuClick()
{
var room = new Room();
room.EnterPeople();
room.EnterPeople();
room.EnterPeople();
room.LeavePeople();
room.LeavePeople();
room.LeavePeople();
room.EnterPeople();
}
#endif
class Light
{
public void Open()
{
Debug.Log("灯打开了");
}
public void Close()
{
Debug.Log("灯关闭了");
}
}
class Room:SimpleRC
{
Light mLight = new Light();
public void EnterPeople()
{
if (RefCount == 0)
{
mLight.Open();
}
Retain();
Debug.LogFormat("一个人进入房间,当前房间有{0}个人", RefCount);
}
public void LeavePeople()
{
Release();
Debug.LogFormat("一个人离开房间,当前房间有{0}个人", RefCount);
}
protected override void OnZeroRef()
{
mLight.Close();
}
}
}
}
运行结果: