外观模式

外观模式

定义

外观模式(Facade)

​ “为子系统定义一组统一的接口,这个高级的接口会让子系统更容易被使用”
解释:

​ 外观模式其实相当容易理解,假设我们有非常多的子系统,每个系统各自又有很多的接口,这使得这些系统阅读和使用起来非常不便,而一般的客户并不关心子系统的细节,他们只关注于有限的一些内容,所以我们需要一个门面(facade)去让他能够更简单的使用这些系统。

UML

外观模式
相当容易理解的类图

代码

子系统们

namespace DesignModel.Facade
{
	public class SubSystemA 
	{
		public void OperateOne()
		{
			Debug.Log("SubSystem A : One");
		}

		public void OperateTwo()
		{
			Debug.Log("SubSystem A : Two");
		}
	}
    
    public class SubSystemB  
	{
		public void Operate1()
		{
			Debug.Log("SubSystem B : 1");
		}

		public void Operate2()
		{
			Debug.Log("SubSystem B : 2");
		}
	}
}

门面(Facade)

namespace DesignModel.Facade
{
	public class Facade  
	{
		private SubSystemA subSystemA;
		private SubSystemB subSystemB;
		public Facade()
		{
			subSystemA = new SubSystemA();
			subSystemB = new SubSystemB();
		}	

		public void OperateOne()
		{
			Debug.Log("Show One Operata : ");
			subSystemA.OperateOne();
			subSystemB.Operate1();
		}

		public void OperateNumber()
		{
			Debug.Log("Show Arabic Numerals Operata : ");
			subSystemB.Operate1();
			subSystemB.Operate2();
		}
	}
}

简单测试

using DesignModel.Facade;
public class Client_Facade : MonoBehaviour 
{
	void Start () 
	{
		Facade facade = new Facade();
		facade.OperateOne();
		facade.OperateNumber();
	}
}

测试结果

外观模式

拓展

外观模式非常简单,就是对已有系统做一次包装,以方便客户的使用

外观模式不局限于对类的包装,简单一些的应用也可以是同个类中对函数的包装

外观模式同适配器模式非常类似,区别仅在于,适配器模式是为了将接口更换为目标接口,外观模式是为了将子系统整合提供一个门面

优点

1.屏蔽了子系统,使客户的使用起来更加简单

2.使客户端和子系统之间解藕,子系统的变化不会影响到客户端

缺点

增加新的子系统或修改现有的系统可能需要修改外观类或客户端,违背了“开闭原则”。

在实际应用中

我们经常用到外观模式对类的功能分层整理

同时在对接新的插件时,尽量对需要的功能做一次封装(适配器或外观),一旦更换插件或插件本身的接口作出改变后,可以在不改动现有代码的情况下,仅对适配器或外观进行修改即可。