簡(jiǎn)介
unity有自己的Message 機(jī)制锄禽,IF 框架 當(dāng)然也要自己搞一個(gè)啊靴姿。IF 框架中的 消息模塊根據(jù)觀察者模式+Type 實(shí)現(xiàn)佛吓。利用IF 框架中的消息模塊,不但可以解除耦合淤刃,而且后續(xù)開(kāi)發(fā)中 需要寫(xiě)的代碼也相對(duì)較少吱型。
消息模塊的使用
使用前說(shuō)明:在C#中,觀察者模式被事件所支持铝侵,使用起來(lái)很方便。那么IF 框架中的 消息模塊 和事件的區(qū)別 在哪里狐赡?
簡(jiǎn)介中提到疟丙,IF的消息轉(zhuǎn)發(fā)模塊 是通過(guò)“Type”實(shí)現(xiàn)享郊,所以 其使用層為:類(lèi)型層。舉個(gè)栗子:定義了貓類(lèi)型(被觀察者)穴墅、老鼠類(lèi)型(觀察者)温自。 那么 一旦實(shí)現(xiàn)了IF框架的觀察者模式悼泌。所有的老鼠對(duì)象,都會(huì)去觀測(cè)每一只貓的動(dòng)向隘世。2000只老鼠鸠踪、1000只貓。每一只老鼠都會(huì)觀察1000只貓械媒,每只貓都被2000只老鼠“盯”著评汰。
代碼如下:
using System;
using UnityEngine;
using IFramework; // 引入IF命名空間
// 觀察者 需要實(shí)現(xiàn) IObserver 接口
public class MyListenner : IObserver
{
private string name;
public MyListenner(string name)
{ this.name = name;
// 需要觀測(cè)的類(lèi)型被去。 若有倆個(gè) 類(lèi)型需要被觀察 如下:
this.Subscribe<MyPublisher>(); // 這里有個(gè)泛型約束:T :IPublisher。
this.Subscribe<MyPublisher2>();
}
// 實(shí)現(xiàn)的接口方法糜值, 將會(huì)在 收到消息 時(shí)被調(diào)用。
public void Listen(IPublisher publisher, Type eventType, int code, IEventArgs args, params object[] param)
{
Log.L(string.Format("Recieve code {0} from type {1}", code,eventType));
foreach (var item in param)
{
Log.L($"{name}:{item.ToString()}");
}
}
}
// 被觀察者 需要實(shí)現(xiàn) IPublisher 接口
public class MyPublisher:IPublisher{
public string name;
public MyPublisher(string name){
this.name = name;
}
}
// 另外一種被觀察者 需要實(shí)現(xiàn) IPublisher 接口
public class MyPublisher2:IPublisher{
public string name;
public MyPublisher2(string name){
this.name = name;
}
}
public class MessageIF : MonoBehaviour
{
void Start()
{
MyListenner listenner1 = new MyListenner("觀察者一號(hào)");
MyListenner listenner2 = new MyListenner("觀察者二號(hào)");
MyPublisher publisher = new MyPublisher("終極Boos");
publisher.Publish(1,null,$"檢測(cè)到{publisher.name}開(kāi)始行動(dòng)","出擊畅蹂!");
MyPublisher2 publisher2 = new MyPublisher2("雜魚(yú)");
publisher2.Publish(1,null,$"檢測(cè)到{publisher2.name}開(kāi)始行動(dòng)","出擊!");
}
}
代碼解析:
代碼種累贤,定義了 兩種 “被觀察者”類(lèi)型少漆,一種“觀察者”類(lèi)型臼膏。實(shí)例化時(shí):兩種觀察者各實(shí)例化 一個(gè), 觀察者實(shí)例化 兩個(gè)示损。 用于 區(qū)分 類(lèi)型層和 對(duì)象層上的 的不同渗磅。
最終輸出結(jié)果:
是不是很簡(jiǎn)單。特別是在大規(guī)模對(duì)象的 消息發(fā)送中检访。我們不用去為每一個(gè)對(duì)象 注冊(cè)事件了始鱼。
結(jié)尾
以上內(nèi)容是 作者個(gè)人的理解,如有錯(cuò)誤脆贵,歡迎指出医清。
順便給出OnClick大佬自己 寫(xiě)的文檔地址:004 消息轉(zhuǎn)發(fā)模塊(觀察者模式)
如果對(duì) IF框架有其他看法,也歡迎大家 進(jìn)群交流卖氨。