Having a facade is handy when you need to integrate your app with a sophisticated library that has dozens of features, but you just need a tiny bit of its functionality. 当你需要将你的应用与一个复杂的库集成时,拥有一个外观是很方便的,这个库有几十个功能,但你只需要它的一小部分功能。
// These are some of the classes of a complex 3rd-party video // conversion framework. We don't control that code, therefore // can't simplify it.
classVideoFile // ...
classOggCompressionCodec // ...
classMPEG4CompressionCodec // ...
classCodecFactory // ...
classBitrateReader // ...
classAudioMixer // ...
// We create a facade class to hide the framework's complexity // behind a simple interface. It's a trade-off between // functionality and simplicity. classVideoConverter is method convert(filename, format):File is file=newVideoFile(filename) sourceCodec = (newCodecFactory).extract(file) if (format == "mp4") destinationCodec = newMPEG4CompressionCodec() else destinationCodec = newOggCompressionCodec() buffer = BitrateReader.read(filename, sourceCodec) result = BitrateReader.convert(buffer, destinationCodec) result = (newAudioMixer()).fix(result) returnnewFile(result)
// Application classes don't depend on a billion classes // provided by the complex framework. Also, if you decide to // switch frameworks, you only need to rewrite the facade class. classApplication is method main()is convertor=newVideoConverter() mp4 = convertor.convert("funny-cats-video.ogg", "mp4") mp4.save()
classFacade: """ 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. """
def__init__(self, subsystem1: Subsystem1, subsystem2: Subsystem2) -> None: """ Depending on your application's needs, you can provide the Facade with existing subsystem objects or force the Facade to create them on its own. """
self._subsystem1 = subsystem1 or Subsystem1() self._subsystem2 = subsystem2 or Subsystem2()
defoperation(self) -> str: """ 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. """
results = [] results.append("Facade initializes subsystems:") results.append(self._subsystem1.operation1()) results.append(self._subsystem2.operation1()) results.append("Facade orders subsystems to perform the action:") results.append(self._subsystem1.operation_n()) results.append(self._subsystem2.operation_z()) return"\n".join(results)
classSubsystem1: """ 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. """
defclient_code(facade: Facade) -> None: """ 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. """
print(facade.operation(), end="")
if __name__ == "__main__": # 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() subsystem2 = Subsystem2() facade = Facade(subsystem1, subsystem2) client_code(facade)
Output.txt:执行结果
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!
// Wallet Facade interacts with the account, code, wallet, notification and // ledger behind the scenes. wallet.add_money_to_wallet(&"abc".into(), 1234, 10)?; println!();
Starting add money to wallet Account verified Security code verified Sending wallet credit notification Make ledger entry for accountId abc with transaction type credit for amount 10
Starting debit money from wallet Account verified Security code verified Sending wallet debit notification Make ledger entry for accountId abc with transaction type debit for amount 5