外观模式:为子系统定义一组统一的接口,这个高级的接口会让子系统更容易被使用。
外观模式有点黑箱的意思,即把内部细节封装起来,对外只有简单的接口方便调用。比如一台电视机内部有显像系统,声音系统,电子系统等等,通过这些系统协调工作才组成了一台功能正常的电视机。而当我们想看电视时,并不用关系这些系统怎么配合,只需要接通电源,打开电视机就可以看了。
所以,外观模式的重点在于,它能将系统内部的互动细节隐藏以来,并提供简单方便的接口,之后客户端只需要通过这个接口,就可以操作一个复杂系统并让他们顺利运行。
惯例盗张结构图_(:з」∠)_
上图是使用外观模式之后的,如果未使用状态模式大概长这样:
看起来貌似也没多大问题,不过当Client多了可就不一样了:
这下调用结果相当混乱,很容易就晕了。。
可以看到整个系统分为三个部分:
- 客户端,用户。从原本需要操作多个子系统的情况,改为只需要面对一个整合后的界面。
- 统一对外的界面。整合所有子系统的接口及功能,并提供接口供Client使用。<br>同时接收客户端的信息后,将信息传送给子系统。
- 子系统。原本会由不同的Client来操作,改为只会由内部系统互相使用。
代码演示
SusSystem
为了方便演示每个系统都只有启动和关闭方法
class SubSystem1 { public void Start() { Console.WriteLine("SubSystem1已启动"); } public void Close() { Console.WriteLine("SubSystem1已关闭"); } } class SubSystem2 { public void Start() { Console.WriteLine("SubSystem2已启动"); } public void Close() { Console.WriteLine("SubSystem2已关闭"); } } class SubSystem3 { public void Start() { Console.WriteLine("SubSystem3已启动"); } public void Close() { Console.WriteLine("SubSystem3已关闭"); } }
Facade
Facade持有了以上单个子系统的引用,并定义了总开关方法
class Facade { private SubSystem1 sub1; private SubSystem2 sub2; private SubSystem3 sub3; public Facade() { sub1 = new SubSystem1(); sub2 = new SubSystem2(); sub3 = new SubSystem3(); } public void StartAllSubSystem() { sub1.Start(); sub2.Start(); sub3.Start(); } public void CloseAllSubSystem() { sub1.Close(); sub2.Close(); sub3.Close(); } }
Client
这里我们将Main方法当做Client,只需要一条命令就可以实现打开或关闭所有子系统的方法。
static void Main(string[] args) { Facade facade = new Facade(); facade.StartAllSubSystem(); Console.WriteLine(); facade.CloseAllSubSystem(); }
运行结果:
使用外观模式的优缺点
将复杂的子系统沟通交给单一的一个类负责,并提供单一界面给客户端使用,使客户端减少对系统的耦合度。
使用状态模式可以将Client类单一化,方便的调用一个接口,而不必关心这个接口功能背后是一堆子系统怎么实现的。
减少了Client类不必要的类引用及功能整合(只需要引用一个Facade就够了),增加了Client类被复用的机会。
由此可见,外观模式很利于分工开发。在分工配合时,开发者只需要了解对方负责系统的Facade接口类,不必更进一步关心对方的实现方式。
缺点即是由于将所有子系统集中在Facade接口中,最终会导致Facade接口类过于庞大和难以维护。
这种情况下可以重构Facade接口类,将功能相近的子系统进行整合,以减少内部系统的依赖性,或是整合其他设计模式来减少接口类大小。
1 comment
👿 👿 👿