概述参考请看 参考博客
外观模式通过引入一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一的入口,降低子系统与客户端的耦合度,且客户端调用非常方便。
1、外观模式原型
外观模式原型的UML图
外观模式代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 客户端类
/// </summary>
public class Client:MonoBehaviour
{
public FacadeMode mFacadeMode;
private void Start()
{
mFacadeMode.Work1();
mFacadeMode.Work2();
mFacadeMode.Work3();
}
}
public class SubSystem1
{
public void Method1()
{
//业务系统代码
}
}
public class SubSystem2
{
public void Method2()
{
//业务系统代码
}
}
public class SubSystem3
{
public void Method3()
{
//业务系统代码
}
}
/// <summary>
/// 外观模式原型代码
/// </summary>
public class FacadeMode
{
public SubSystem1 system1 = new SubSystem1();
public SubSystem2 system2 = new SubSystem2();
public SubSystem3 system3 = new SubSystem3();
public void Work1()
{
system1.Method1();
}
public void Work2()
{
system2.Method2();
}
public void Work3()
{
system3.Method3();
}
}
2、外观模式实例
外观模式实例代码
GameFacade类
/// <summary>
/// 外观模式
/// </summary>
public class GameFacade
{
private AchievementSystem mAchievementSystem;
private CharacterSystem mCharacterSystem;
private GameEventSystem mGameEventSystem;
private UISystem mUISystem;
//外观模式
//把初始化系统的代码放在外观模式中。
//实际代码运行则在各个系统中
//调用者只需要调用这个Init函数就行了。
public void Init()
{
mAchievementSystem.Init();
mCharacterSystem.Init();
mGameEventSystem.Init();
mUISystem.Init();
}
}
调用初始化系统的代码则放在这个场景类中。
假如当客户端需要使用某个系统的方法时,只需要在GameFacade中调用这个方法,不再需要再客户端中持有这个系统再调用这个系统的方法了,只需要持有一个GameFacade就可以了。
之后我们可以再把GameFacade改成单例模式,那么就连GameFacade的持有也不需要了,非常方便。
3、外观模式优缺点
优点
- 降低系统和客户间的耦合性
- 外观模式对客户端屏蔽了子系统组件,从而简化了接口,减少了客户端处理的对象数目并使子系统的使用更加简单。
缺点
- 增加新系统需要修改外观类代码,违背开闭原则