using System.Collections; using System.Collections.Generic; using UnityEngine; using PureMVC.Patterns; using System; using LitJson; using PureMVC.Patterns.Facade; using Skyunion; using PureMVC.Patterns.Mediator; using PureMVC.Interfaces; using Sproto; using SprotoType; using PureMVC.Patterns.Observer; //命令总入口文件,所有的命令都需要在这里注册 namespace Game { public class AppFacade : Facade//外观模式,给外部提供一个统一的接口 { public const string STARTUP = "AppFacade.StartUp";//启动命令 private Dictionary m_viewMap = new Dictionary();//视图映射 private Dictionary m_MediatorMap = new Dictionary();//中介者映射 private Dictionary m_globalMap = new Dictionary();//全局中介者映射 public static AppFacade GetInstance()//获取实例 { return GetInstance(() => new AppFacade()) as AppFacade; } public static void Destroy() { instance = null; PureMVC.Core.View.Destroy(); PureMVC.Core.Model.Destroy(); PureMVC.Core.Controller.Destroy(); } /// /// 命令模式:将请求封装为对象,支持参数化,队列化,日志化,撤销 /// 工作原理: /// 注册:将通知名称与命令类绑定 /// RegisterCommand("LoginAccount", () => new LoginCommand()); /// 触发:发送通知时自动创建并执行命令 /// AppFacade.GetInstance().SendNotification("LoginAccount", loginData); /// 执行:命令类实现 Execute 方法处理业务逻辑 /// 优势: /// 解耦:发送者不需要知道具体执行者 /// 可扩展:新增命令只需注册,无需修改现有代码 /// 可撤销:可记录命令历史,支持撤销/重做 /// 可组合:可组合多个命令形成宏命令 /// protected override void InitializeController()//初始化控制器 { base.InitializeController(); #region "薛之猫专用" RegisterCommand(STARTUP, ()=>new StartUpCommand()); RegisterCommand(CmdConstant.ReloadGame, () => new ReloadGameCMD()); RegisterCommand(CmdConstant.ExitGame, () => new ExitGameCMD()); RegisterCommand(CmdConstant.AgreementCheck, () => new AgreementCMD()); RegisterCommand(CmdConstant.LoadAppConfig, () => new LoadAppConfigCMD()); RegisterCommand(CmdConstant.AutoLogin, () => new LoginCommand()); RegisterCommand(CmdConstant.LoginAccount, () => new LoginCommand()); RegisterCommand(CmdConstant.SwitchAccount, () => new LoginCommand()); RegisterCommand(CmdConstant.BindindAccount, () => new LoginCommand()); RegisterCommand(CmdConstant.LoadAccountProfile, () => new LoginCommand()); RegisterCommand(CmdConstant.AccountBan, () => new LoginCommand()); RegisterCommand(CmdConstant.SwitchAccountFinished, () => new LoginCommand()); RegisterCommand(CmdConstant.OpenAppRating, () => new AppRatingCMD()); RegisterCommand(CmdConstant.MaintainCheck, () => new MaintainCMD()); RegisterCommand(CmdConstant.MaintainCheckSingleServer, () => new MaintainCMD()); RegisterCommand(CmdConstant.PackageUpdateCheck, () => new MaintainCMD()); RegisterCommand(CmdConstant.HotfixUpteCheck, () => new MaintainCMD()); RegisterCommand(CmdConstant.HotfixDownCompleted, () => new MaintainCMD()); RegisterCommand(CmdConstant.MoveCameraCmd, () => new CameraCmd()); #endregion CoreUtils.uiManager.AddShowUIListener(OnShowUI); CoreUtils.uiManager.AddCloseUIListener(OnCloseUI); // 在这里注册所有的 Command //RegisterCommand(CmdConstant.NetWorkError, new NetCommand()); RegisterCommand(CmdConstant.SwitchMainCityCmd, () => new SwitchMainCityCmd()); RegisterCommand(CmdConstant.ResetSceneCmd, () => new ResetSceneCmd()); RegisterCommand(Item_ItemInfo.TagName, () => new PlayerCmd()); RegisterCommand(Build_BuildingInfo.TagName, () => new PlayerCmd()); RegisterCommand(Item_ItemUse.TagName, () => new PlayerCmd()); RegisterCommand(CmdConstant.SystemDayTimeChange, () => new PlayerCmd()); RegisterCommand(Map_ObjectInfo.TagName, () => new MapObjCmd()); RegisterCommand(Map_ObjectDelete.TagName, () => new MapObjCmd()); RegisterCommand(Build_GetBuildResources.TagName,()=>new CurrencyCMD()); //RegisterCommand(CmdConstant.GuideForceShowResCollect, ()=>new CurrencyCMD()); RegisterCommand(Role_Heart.TagName, () => new ServerTimeCommand()); RegisterCommand(Hero_HeroInfo.TagName, () => new HeroCmd()); RegisterCommand(CmdConstant.GetNewHero, () => new HeroCmd()); //邮件 RegisterCommand(Email_GetEmails.TagName, () => new EmailCMD()); RegisterCommand(Email_EmailList.TagName, () => new EmailCMD()); RegisterCommand(Email_TakeEnclosure.TagName, () => new EmailCMD()); RegisterCommand(Email_CollectEmail.TagName, () => new EmailCMD()); RegisterCommand(Email_DeleteEmail.TagName, () => new EmailCMD()); RegisterCommand(CmdConstant.SystemHourChange, () => new EmailCMD()); //加速 RegisterCommand(CmdConstant.SpeedUp,()=>new SpeedUpCMD()); //奖励展示 RegisterCommand(CmdConstant.RewardGet, () => new RewardGetCMD()); //章节 RegisterCommand(CmdConstant.ChapterTimelineShow, ()=>new TaskCMD()); RegisterCommand(CmdConstant.ChapterIdChange,()=>new TaskCMD()); RegisterCommand(CmdConstant.OnChapterDiaglogEnd, ()=>new TaskCMD()); RegisterCommand(CmdConstant.TaskRewardEnd, ()=>new TaskCMD()); //工人小屋 RegisterCommand (CmdConstant.buildQueueChange, () => new WorkerCMD()); //开场剧情对话 RegisterCommand(CmdConstant.ShowNPCDiaglog,()=>new NPCDialogCMD()); //章节对白 RegisterCommand(CmdConstant.ShowChapterDiaglog,()=>new NPCDialogCMD()); //科技研究完成 RegisterCommand(Technology_ResearchTechnology.TagName,()=>new ResearchCMD()); //特效层遮罩 RegisterCommand(CmdConstant.ShowMask,()=>new StoryCMD()); RegisterCommand(CmdConstant.HideMask, () => new StoryCMD()); RegisterCommand(CmdConstant.OnMysteryStoreRefresh, () => new StoryCMD()); RegisterCommand(Role_MysteryStore.TagName, () => new StoryCMD()); //斥候 RegisterCommand(Map_Scouts.TagName, () => new ScoutCMD()); RegisterCommand(Map_ScoutsBack.TagName, () => new ScoutCMD()); //玩家属性相关 RegisterCommand(CmdConstant.UpdatePlayerCountry, () => new PlayerAttributeCmd()); RegisterCommand(CmdConstant.technologyChange, () => new PlayerAttributeCmd()); RegisterCommand(CmdConstant.CityBuildinginfoFirst, () => new PlayerAttributeCmd()); RegisterCommand(CmdConstant.CityBuildinginfoChange, () => new PlayerAttributeCmd()); RegisterCommand(CmdConstant.UpdateHero, () => new PlayerAttributeCmd()); RegisterCommand(CmdConstant.VipLevelUP, () => new PlayerAttributeCmd()); RegisterCommand(Guild_GuildTechnologies.TagName,() => new PlayerAttributeCmd()); RegisterCommand(CmdConstant.AllianceEixtEx, () => new PlayerAttributeCmd()); RegisterCommand(CmdConstant.GuildOfficerInfoChange, () => new PlayerAttributeCmd()); //聊天 RegisterCommand(Chat_PushMsg.TagName, () => new ChatCMD()); RegisterCommand(CmdConstant.ChatClientNetEvent,()=>new ChatCMD()); RegisterCommand(CmdConstant.OnCityLoadFinished,()=>new ChatCMD()); RegisterCommand(Guild_CreateGuild.TagName, ()=>new ChatCMD()); RegisterCommand(Guild_ApplyJoinGuild.TagName, ()=>new ChatCMD()); RegisterCommand(CmdConstant.AllianceEixt, ()=>new ChatCMD()); RegisterCommand(Chat_Msg2GSQueryPrivateChatLst.TagName, () => new ChatCMD()); RegisterCommand(Chat_Msg2GSQueryPrivateChatByRid.TagName, () => new ChatCMD()); RegisterCommand(Chat_SendMsg.TagName, () => new ChatCMD()); //城市buff RegisterCommand(CmdConstant.CityBuffChange,()=>new CityBuffCMD()); //OpenUI RegisterCommand(CmdConstant.OpenUI,()=>new OpenUICMD()); RegisterCommand(CmdConstant.OpenUI2, () => new OpenUICMD()); RegisterCommand(Activity_Reward.TagName, ()=>new ActivityCMD()); RegisterCommand(Activity_RewardBox.TagName, ()=>new ActivityCMD()); RegisterCommand(Activity_ScheduleInfo.TagName, ()=>new ActivityCMD()); RegisterCommand(Activity_Exchange.TagName, ()=>new ActivityCMD()); RegisterCommand(CmdConstant.ItemInfoChange, ()=>new ActivityCMD()); RegisterCommand(CmdConstant.SystemDayChange, ()=>new ActivityCMD()); RegisterCommand(Activity_Rank.TagName, ()=>new ActivityCMD()); RegisterCommand(CmdConstant.ActivityActivePointUpdate, ()=>new ActivityCMD()); RegisterCommand(Activity_TurnTable.TagName, ()=>new ActivityCMD()); RegisterCommand(Activity_ClickActivity.TagName, ()=>new ActivityCMD()); //小地图 RegisterCommand(Guild_GuildMemberPos.TagName, () => new MinimapCMD()); //角色模块通知 RegisterCommand(Role_RoleNotify.TagName, () => new RoleNotify()); //资源运输 RegisterCommand(Transport_GetTransport.TagName, () => new AssitResCMD()); RegisterCommand(Transport_CreateTransport.TagName, () => new AssitResCMD()); RegisterCommand(Transport_TransportSuccess.TagName, () => new AssitResCMD()); //战争预警 RegisterCommand(Role_EarlyWarningInfo.TagName, () => new WarWarningCMD()); //跑马灯 RegisterCommand(Chat_MarqueeNotify.TagName,()=>new ScrollMessageCMD()); //充值 RegisterCommand(Recharge_RechargeInfo.TagName, () => new RechargeCMD()); RegisterCommand(Map_MoveCity.TagName, () => new MoveCityCMD()); RegisterCommand(CmdConstant.EventTracking, () => new EventTrackingCMD()); //地图书签 RegisterCommand(Map_AddMarker.TagName, () => new MapMarkerCMD()); RegisterCommand(Map_ModifyMarker.TagName, () => new MapMarkerCMD()); RegisterCommand(Map_DeleteMarker.TagName, () => new MapMarkerCMD()); RegisterCommand(CmdConstant.PersonMapMarkerInfoChanged, () => new MapMarkerCMD()); RegisterCommand(CmdConstant.GuildMapMarkerInfoChanged, () => new MapMarkerCMD()); } public void StartUp() { SendNotification(STARTUP);//发送启动命令 } /// /// 中介者模式:定义对象间的一对多依赖,让多个对象不需要直接交互,通过中介者协调 /// 工作原理: /// 注册:将中介者与视图绑定 /// RegisterMediator(new PlayerMediator()); /// 触发:发送通知时通知中介者处理 /// AppFacade.GetInstance().SendNotification("PlayerInfoChanged", playerData); /// 处理:中介者实现 HandleNotification 方法处理业务逻辑 /// 优势: /// 解耦:对象间解耦,互不直接依赖 /// 可扩展:新增中介者只需注册,无需修改现有代码 /// 可维护:统一管理对象关系,易于维护 /// 但是这里的中介者更像视图控制器 /// public override void RegisterMediator(IMediator mediator)////注册视图控制器中介者 { ViewBinder vb = null; if (mediator.ViewComponent != null) { vb = ((GameObject) mediator.ViewComponent).GetComponent(); } if (vb != null) { m_viewMap[vb] = mediator; } if (!m_MediatorMap.ContainsKey(mediator.MediatorName)) { m_MediatorMap[mediator.MediatorName] = mediator; } base.RegisterMediator(mediator); } public override IMediator RetrieveMediator(string mediatorName) { if (m_MediatorMap.ContainsKey(mediatorName)) { return m_MediatorMap[mediatorName]; } return base.RetrieveMediator(mediatorName); } public override IMediator RemoveMediator(string mediatorName) { if (m_MediatorMap.ContainsKey(mediatorName)) { m_MediatorMap.Remove(mediatorName); } return base.RemoveMediator(mediatorName); } public void RemoveView(ViewBinder view) { if (m_viewMap.ContainsKey(view)) { IMediator md = m_viewMap[view]; AppFacade.GetInstance().RemoveMediator(md.MediatorName); } } public void RegisterGlobalMediator(Mediator mediator) { m_globalMap.Add(mediator.MediatorName, mediator); base.RegisterMediator(mediator); } public void RemoveGlobalMediator(string mediatorName) { if (m_globalMap.ContainsKey(mediatorName)) { Mediator md = m_globalMap[mediatorName]; AppFacade.GetInstance().RemoveMediator(md.MediatorName); m_globalMap.Remove(mediatorName); } } /// /// 观察者模式:定义对象间的一对多依赖,让多个对象不需要直接交互,通过观察者协调 /// 工作原理: /// 注册:将观察者与被观察者绑定 /// RegisterObserver(new Observer()); /// 触发:被观察者状态改变时通知观察者 /// AppFacade.GetInstance().SendNotification("PlayerInfoChanged", playerData); /// 处理:观察者实现 HandleNotification 方法处理业务逻辑 /// 优势: /// 解耦:对象间解耦,互不直接依赖 /// public override void SendNotification(string notificationName, object body = null, string type = null) { base.SendNotification(notificationName, body, type); SubViewManager.Instance.NotifyObervers(new Notification(notificationName, body, type)); } public void SendSproto(SprotoTypeBase obj) { var net = AppFacade.GetInstance().RetrieveProxy(NetProxy.ProxyNAME) as NetProxy; net.SendSproto(obj); } private void OnShowUI(UIInfo ui) { AppFacade.GetInstance().SendNotification(CmdConstant.OnShowUI, ui); } private void OnCloseUI(UIInfo ui) { AppFacade.GetInstance().SendNotification(CmdConstant.OnCloseUI, ui); } } }