中介者模式+游戏开发中的设计模式——中介者模式

siki学院学习笔记——中介者模式

设计模式之中介者模式(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 {

	
}

猜你喜欢

转载自blog.csdn.net/qq_35422344/article/details/86347992