The before code shows the client directly calling multiple subsystem methods, which is complex and error-prone. The after code introduces a Facade class that wraps subsystem calls into a single simple method. The client now calls only the Facade, reducing complexity and dependencies.
### Before applying Facade pattern (complex client code):
class SubsystemA:
def operation_a1(self):
return "SubsystemA: Operation A1"
def operation_a2(self):
return "SubsystemA: Operation A2"
class SubsystemB:
def operation_b1(self):
return "SubsystemB: Operation B1"
def operation_b2(self):
return "SubsystemB: Operation B2"
# Client must interact with both subsystems directly
sub_a = SubsystemA()
sub_b = SubsystemB()
result = []
result.append(sub_a.operation_a1())
result.append(sub_a.operation_a2())
result.append(sub_b.operation_b1())
result.append(sub_b.operation_b2())
print('\n'.join(result))
### After applying Facade pattern (simplified client code):
class Facade:
def __init__(self):
self.sub_a = SubsystemA()
self.sub_b = SubsystemB()
def simple_operation(self):
results = []
results.append(self.sub_a.operation_a1())
results.append(self.sub_b.operation_b2())
return '\n'.join(results)
# Client interacts only with Facade
facade = Facade()
print(facade.simple_operation())