外观模式是一种结构型模式,能为程序库、框架或其他复杂类提供一个简单的接口。
假设你必须在代码中使用某个复杂的库或框架中的众多对象。正常情况下,你需要负责所有对象的初始化工作、管理其依赖关系并按正确的顺序执行方法等。
最终,程序中类的业务逻辑将与第三方类的实现细节紧密耦合,使得理解和维护代码的工作很难进行。
外观类为包含许多活动部件的复杂子系统提供一个简单的接口。与直接调用子系统相比,外观提供的功能可能比较有限,但它却包含了客户端真正关心的功能。
如果你的程序需要与包含几十种功能的复杂库整合,但只需使用其中非常少的功能,那么使用外观模式会非常方便,
例如,上传猫咪搞笑短视频到社交媒体网站的应用可能会用到专业的视频转换库,但它只需使用一个包含encode(filename, format)方法(以文件名与文件格式为参数进行编码的方法)的类即可。在创建这个类并将其连接到视频转换库后,你就拥有了自己的第一个外观。

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 | using System;namespace RefactoringGuru.DesignPatterns.Facade.Conceptual{ // The Facade class provides a simple interface to the complex logic of one // or several subsystems. The Facade delegates the client requests to the // appropriate objects within the subsystem. The Facade is also responsible // for managing their lifecycle. All of this shields the client from the // undesired complexity of the subsystem. public class Facade { protected Subsystem1 _subsystem1; protected Subsystem2 _subsystem2; public Facade(Subsystem1 subsystem1, Subsystem2 subsystem2) { this._subsystem1 = subsystem1; this._subsystem2 = subsystem2; } // The Facade's methods are convenient shortcuts to the sophisticated // functionality of the subsystems. However, clients get only to a // fraction of a subsystem's capabilities. public string Operation() { string result = "Facade initializes subsystems:\n"; result += this._subsystem1.operation1(); result += this._subsystem2.operation1(); result += "Facade orders subsystems to perform the action:\n"; result += this._subsystem1.operationN(); result += this._subsystem2.operationZ(); return result; } } // The Subsystem can accept requests either from the facade or client // directly. In any case, to the Subsystem, the Facade is yet another // client, and it's not a part of the Subsystem. public class Subsystem1 { public string operation1() { return "Subsystem1: Ready!\n"; } public string operationN() { return "Subsystem1: Go!\n"; } } // Some facades can work with multiple subsystems at the same time. public class Subsystem2 { public string operation1() { return "Subsystem2: Get ready!\n"; } public string operationZ() { return "Subsystem2: Fire!\n"; } } class Client { // The client code works with complex subsystems through a simple // interface provided by the Facade. When a facade manages the lifecycle // of the subsystem, the client might not even know about the existence // of the subsystem. This approach lets you keep the complexity under // control. public static void ClientCode(Facade facade) { Console.Write(facade.Operation()); } } class Program { static void Main(string[] args) { // The client code may have some of the subsystem's objects already // created. In this case, it might be worthwhile to initialize the // Facade with these objects instead of letting the Facade create // new instances. Subsystem1 subsystem1 = new Subsystem1(); Subsystem2 subsystem2 = new Subsystem2(); Facade facade = new Facade(subsystem1, subsystem2); Client.ClientCode(facade); } }} |
|---|
执行结果:
123456 | Facade initializes subsystems:Subsystem1: Ready!Subsystem2: Get ready!Facade orders subsystems to perform the action:Subsystem1: Go!Subsystem2: Fire! |
|---|
参考原文:外观设计模式