设计模式之中介者模式(Mediator)
http://www.cnblogs.com/BeyondAnyTime/archive/2012/08/30/2663922.html
中介者模式(Mediator):用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式的相互引用,从而使其耦合松散,而且可以独立的改变他们之间的交互。
中介者模式是完成系统内所有子类之间的交互,子类1通过中介者实现与子类2、3等的通信,,而子类1与子类2、3等是相互独立的,从而降低了耦合。
与外观模式区别,外观模式是这个系统与外系统进行交互
“Colleague"——抽象同事类 构造方法--得到中介者对象ConcreteMedoator 使每个具体同事类认识ConcreteMedoator
ConcreteColleague——具体同事类 每个只知道自己的行为,相互之间不认识,但都认识具体中介者
Mediator——抽象中介者 定义方法
ConcreteMedoator——具体中介者 要了解所有具体同事(就变得很复杂了),重写方法
使用中介者模式的优点:
1.降低了系统对象之间的耦合性,使得对象易于独立的被复用。
2.提高系统的灵活性,使得系统易于扩展和维护。
使用中介者模式的缺点:
中介者模式的缺点是显而易见的,因为这个“中介“承担了较多的责任,所以一旦这个中介对象出现了问题,那么整个系统就会受到重大的影响。
应用于一组对象已经定义良好,但复杂的方式进行通信的场合
想制定一个分布在多个类中的行为,而又不想生成太多子类的场合,,,,
将Facade做为中介者,相当于"ConcreteMedoator——具体中介者"
Facade作为中介者
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class GameFacade {
//创建游戏子系统管理的总类Facade(外观模式)
//单例模式--静态初始化,,,此外还有多线程情况中的双重锁定 也可以实现相同功能
//01创建静态的私有变量,并实例化(在第一次引用类的任何成员时创建实例)
private static GameFacade _instance = new GameFacade();
private bool mIsGameOver = false;//辅助状态管理,添加游戏是否结束,判断何时切换场景
//单例模式
//03创建全局唯一访问点
public static GameFacade Instance { get { return _instance; } }
public bool isGameOver {get { return mIsGameOver; }}
//单例模式
//02私有化构造函数(不能再外部实例化,即不能new)
private GameFacade() { }
//中介者模式
//01获取所有子系统
private AchievementSystem mAchievementSystem;
private CampSystem mCampSyatem;
private CharacterSystem mChararcterSystem;
private EnergySystem mEnergySystem;
private GameEventSystem mGameEventSystem;
private StageSystem mStageSystem;
private CampInfoUI mCampInforUI;
private GamePauseUI mGamePauseUI;
private GameStateInfoUI mGameStateInfoUI;
private SoldierInfoUI mSoliderInfoUI;
public void Init () //外观模式-即MethodOne
{
//外观模式-具体的A\B\C\D等子类
//中介者模式
//02实例化所有子系统
mAchievementSystem = new AchievementSystem();
mCampSyatem = new CampSystem();
mChararcterSystem = new CharacterSystem();
mEnergySystem = new EnergySystem();
mGameEventSystem = new GameEventSystem();
mStageSystem = new StageSystem();
mCampInforUI = new CampInfoUI();
mGamePauseUI = new GamePauseUI();
mGameStateInfoUI = new GameStateInfoUI();
mSoliderInfoUI = new SoldierInfoUI();
//中介者模式
mAchievementSystem.Init();
mCampSyatem.Init();
mChararcterSystem.Init();
mEnergySystem.Init();
mGameEventSystem.Init();
mStageSystem.Init();
mCampInforUI.Init();
mGamePauseUI.Init();
mGameStateInfoUI.Init();
mSoliderInfoUI.Init();
}
public void Update()//即MethodTwo
{
//具体的A\B\C\D等子类
//中介者模式
mAchievementSystem.Updata();
mCampSyatem.Updata();
mChararcterSystem.Updata();
mEnergySystem.Updata();
mGameEventSystem.Updata();
mStageSystem.Updata();
mCampInforUI.Update();
mGamePauseUI.Update();
mGameStateInfoUI.Update();
mSoliderInfoUI.Update();
}
public void Release() //即MethodThree
{
//具体的A\B\C\D等子类
//中介者模式
mAchievementSystem.Release();
mCampSyatem.Release();
mChararcterSystem.Release();
mEnergySystem.Release();
mGameEventSystem.Release();
mStageSystem.Release();
mCampInforUI.Release();
mGamePauseUI.Release();
mGameStateInfoUI.Release();
mSoliderInfoUI.Release();
}
}
基类IGameSystem和IBaseUI
基类IGameSystem 及 对应的具体子类 AchievementSystem、、、StageSystem
稍后完成构造方法--得到中介者对象 即GameFacade
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public abstract class IGameSystem
{
public virtual void Init() { }
public virtual void Updata() { }
public virtual void Release() { }
}
AchievementSystem
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class AchievementSystem : IGameSystem
{
}
基类IBaseUI 及 对应的具体子类 CampInforUI、、、SoliderInforUI
稍后完成构造方法--得到中介者对象 即GameFacade
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public abstract class IBaseUI
{
public virtual void Init() { }
public virtual void Update() { }
public virtual void Release() { }
}
CampInforUI
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class CampInfoUI : IBaseUI {
}