namespaceRefactoringGuru.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. publicclassFacade { protected Subsystem1 _subsystem1;
// 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. publicstringOperation() { 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. publicclassSubsystem1 { publicstringoperation1() { return"Subsystem1: Ready!\n"; }
// Some facades can work with multiple subsystems at the same time. publicclassSubsystem2 { publicstringoperation1() { return"Subsystem2: Get ready!\n"; }
classClient { // 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. publicstaticvoidClientCode(Facade facade) { Console.Write(facade.Operation()); } }
classProgram { staticvoidMain(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); } } }
执行结果:
1 2 3 4 5 6
Facade initializes subsystems: Subsystem1: Ready! Subsystem2: Get ready! Facade orders subsystems to perform the action: Subsystem1: Go! Subsystem2: Fire!