Mediator和Command的交互

因为是有关Mediator和Command的事件,所以将事件枚举命名为

public enum MCCubeEvent  {
    UpdateCunePos,
    UpdateCunePosComplete
}

先是Mediator层

using UnityEngine;
using strange.extensions.mediation.impl;
using strange.extensions.dispatcher.eventdispatcher.api;
using strange.extensions.context.api;

public class CubeViewMediator : EventMediator {

	[Inject]
	public CubeView cubeView{ get; set;}

	public override void OnRegister ()
	{
        //监听Command处理完成的回调
        dispatcher.AddListener(MCCubeEvent.UpdateCunePosComplete, OnUpdatePosComplete);
        cubeView.dispatcher.AddListener(VMCubeEvent.UpdatePosition, OnUpdatePos);
    }

	public override void OnRemove ()
	{
        cubeView.dispatcher.RemoveListener(VMCubeEvent.UpdatePosition, OnUpdatePos);
        dispatcher.RemoveListener(MCCubeEvent.UpdateCunePosComplete, OnUpdatePosComplete);
    }

    private void OnUpdatePos(IEvent evt) {
            //发送命令给Commamd,事先会在Context下绑定,直接调用Command的Execute()方法
        dispatcher.Dispatch(MCCubeEvent.UpdateCunePos,(int)evt.data);
    }

    private void OnUpdatePosComplete(IEvent evt) {
        cubeView.UpdatePosition((Vector3)evt.data);
    }
}

然后是Command层

using UnityEngine;
using strange.extensions.command.impl;

public class CubeUpdateCommand : EventCommand {

    [Inject]
    public CubePositionModel DataModel { get; set; }

    public override void Execute()
    {
        Vector3 newPos = DataModel.pos;
        newPos.x += Random.Range(-2f, 2f);
        DataModel.pos = newPos;

        //处理完后,回调给Mediator,Mediator事先已经监听好了
        dispatcher.Dispatch(MCCubeEvent.UpdateCunePosComplete,newPos);
    }
}

下面是绑定

commandBinder.Bind(MCCubeEvent.UpdateCunePos).To<CubeUpdateCommand>();

总结:两者都是通过全局的dispatcher发送事件的。Mediator通过发送事先在绑定处绑定好了命令的事件来通知Command处理,Command通过发送Mediator层事先绑定好的回调事件来通知Mediator。


首页 我的博客
粤ICP备17103704号