何为外观模式
外观模式(Facade):为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使子系统更加容易使用
依赖倒转原则+迪米特法则思想
代码实现
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 外观模式
{
class Program
{
static void Main(string[] args)
{
Facade facade=new Facade();
//由于Facade的作用,客户端可以根本不知子系统类的存在
facade.MethodOne();
facade.MethodTwo();
Console.ReadKey();
}
}
//外观类
class Facade
{
//外观类,他需要了解所有的子系统的方法或属性,进行组合,以备往外界调用
A a;
B b;
C c;
D d;
public Facade()
{
a=new A();
b=new B();
c=new C();
d=new D();
}
public void MethodOne() {
a.MethodA();
d.MethodD();
}
public void MethodTwo() {
b.MethodB();
c.MethodC();
d.MethodD();
}
}
//子系统类
class A {
public void MethodA() {
Console.WriteLine("A类");
}
}
class B
{
public void MethodB()
{
Console.WriteLine("B类");
}
}
class C
{
public void MethodC()
{
Console.WriteLine("C类");
}
}
class D
{
public void MethodD()
{
Console.WriteLine("D类");
}
}
}
应用场合
分三个阶段
首先,在设计初期阶段,应该有意识的将不同的两个层分离,层与层之间建立外观Facade,可以为复杂的子系统提供一个简单的接口,使耦合大大降低
其次,在开发阶段,子系统往往因为不断的重构演化而变得原来越复杂,,,大多数的模式使用时,也都会产生很多很小的类,也给外部调用带来了困难,,,增加外观模式Facade可以提供一个简单的接口,减少他们之间的依赖
第三,在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展,,为新系统开发一个外观Facade类,来提供设计粗糙或高复杂的遗留代码的比较清晰的简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作。
案例:
创建Facade类
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class GameFacade {
//创建游戏子系统管理的总类Facade(外观模式)
//辅助状态管理,添加游戏是否结束,判断何时切换场景
private bool mIsGameOver = false;
public bool isGameOver {
get { return mIsGameOver; }
}
public void Init () //即MethodOne
{
//具体的A\B\C\D等子类
}
public void Update()//即MethodTwo
{
//具体的A\B\C\D等子类
}
public void Release() //即MethodThree
{
//具体的A\B\C\D等子类
}
}
使用Facade类
using System;
using System.Collections.Generic;
using System.Text;
public class AttackState:ISceneState
{
public AttackState(SceneStateControl controller): base("03AttackScene", controller)
{
}
private GameFacade mFacade;
//创建一个类,管理
//兵营、关卡、角色管理、行动力、成就等子系统系统
//由于Facade类的作用,AttackState可以不用知道具体子类的存在
//使用Facade外观模式,使AttackState很简洁,只处理与自身状态有关的
public override void StateStart()
{
mFacade.Init();//使用FacademethodOne
}
public override void StateEnd()
{
mFacade.Release();//使用FacademethodTwo
}
public override void StateUpdate()
{
if(mFacade.isGameOver){
mControler.SetState(new MainState(mControler));
}
mFacade.Update();//使用FacademethodThree
}
}