📖 Scenario: Imagine you are building a simple software system that manages different types of devices and their features. You want to organize your code so it is easy to extend and maintain. To do this, you will learn three common structural design patterns: Adapter, Decorator, and Facade.
🎯 Goal: Build a small example that shows how Adapter, Decorator, and Facade patterns work. You will create basic classes and then apply each pattern step-by-step to see how they help organize and improve the code.
📋 What You'll Learn
Create a basic device interface and two device classes
Add an adapter class to make an incompatible device work with the interface
Create a decorator class to add extra features to a device
Build a facade class to simplify interaction with multiple devices
💡 Why This Matters
🌍 Real World
Structural patterns help organize code in software projects where different components need to work together smoothly, especially when integrating legacy systems or adding new features.
💼 Career
Understanding these patterns is valuable for software developers and architects to write flexible, maintainable, and scalable code in real-world applications.
Progress0 / 4 steps
1
Create basic device classes
Create a class called Device with a method get_status() that returns the string 'Device status: OK'. Then create two classes Printer and Scanner that inherit from Device and override get_status() to return 'Printer ready' and 'Scanner ready' respectively.
Software Engineering
Hint
Define the base class Device with a method that returns a status string. Then create two subclasses that change this status message.
2
Add an Adapter for an incompatible device
Create a class called OldCamera with a method status() that returns 'Old camera active'. Then create an adapter class called CameraAdapter that has a constructor accepting an OldCamera instance and a method get_status() that calls the status() method of OldCamera and returns its result.
Software Engineering
Hint
The adapter wraps the old device and translates its method to the expected interface method.
3
Create a Decorator to add features
Create a class called DeviceDecorator with a constructor that takes a Device instance and stores it. Add a method get_status() that calls the wrapped device's get_status() and appends the string ' with extra features' to the result.
Software Engineering
Hint
The decorator holds a device and extends its behavior by adding text to the status.
4
Build a Facade to simplify device control
Create a class called DeviceFacade with a constructor that creates instances of Printer, Scanner, and CameraAdapter (using an OldCamera instance). Add a method all_statuses() that returns a list of status strings from all three devices by calling their get_status() methods.
Software Engineering
Hint
The facade creates and holds all devices and provides a simple method to get their statuses together.
Practice
(1/5)
1. Which structural pattern allows incompatible interfaces to work together by converting one interface into another?
easy
A. Decorator
B. Adapter
C. Facade
D. Singleton
Solution
Step 1: Understand the role of Adapter pattern
The Adapter pattern converts the interface of one class into another interface clients expect, enabling incompatible interfaces to work together.
Step 2: Compare with other patterns
Decorator adds features, Facade simplifies interfaces, Singleton controls instance creation. Only Adapter changes interfaces for compatibility.
Final Answer:
Adapter -> Option B
Quick Check:
Interface conversion = Adapter [OK]
Hint: Adapter = interface converter between incompatible parts [OK]
Common Mistakes:
Confusing Decorator with Adapter
Thinking Facade changes interfaces
Mixing Singleton with structural patterns
2. Which of the following is the correct way to describe the Decorator pattern?
easy
A. It converts one interface to another.
B. It provides a simple interface to a complex system.
C. It adds new responsibilities to objects dynamically.
D. It ensures a class has only one instance.
Solution
Step 1: Identify the purpose of Decorator pattern
Decorator adds new features or responsibilities to objects dynamically without changing their structure.
Step 2: Eliminate other options
It provides a simple interface to a complex system. describes Facade, It converts one interface to another. describes Adapter, It ensures a class has only one instance. describes Singleton pattern.
Final Answer:
It adds new responsibilities to objects dynamically. -> Option C
Quick Check:
Decorator = add features dynamically [OK]
Hint: Decorator = add features without changing original object [OK]
Common Mistakes:
Mixing Decorator with Facade
Confusing Adapter with Decorator
Thinking Singleton is a structural pattern
3. Consider a system where a Facade pattern is used to simplify multiple complex subsystems. What is the main benefit when a client uses the Facade?
medium
A. The client interacts with a simple interface hiding complexity.
B. The client must adapt its interface to each subsystem.
C. The client can access all subsystem details directly.
D. The client can add new features to subsystems dynamically.
Solution
Step 1: Understand Facade pattern role
Facade provides a simple unified interface to a set of interfaces in a subsystem, hiding complexity from the client.
Step 2: Analyze options
The client can access all subsystem details directly. is wrong because Facade hides details. The client must adapt its interface to each subsystem. describes Adapter. The client can add new features to subsystems dynamically. describes Decorator.
Final Answer:
The client interacts with a simple interface hiding complexity. -> Option A
Quick Check:
Facade = simple interface to complex system [OK]
Hint: Facade hides complexity behind a simple interface [OK]
Common Mistakes:
Thinking Facade exposes all subsystem details
Confusing Facade with Adapter or Decorator
Assuming Facade adds features dynamically
4. A developer tries to use an Adapter pattern but the client code still fails due to interface mismatch. What is the most likely error?
medium
A. The client code is using the correct interface.
B. The Decorator pattern was used instead of Adapter.
C. The Facade pattern was applied to simplify the interface.
D. The Adapter does not implement the target interface correctly.
Solution
Step 1: Identify Adapter pattern requirement
Adapter must implement the target interface expected by the client to convert calls properly.
Step 2: Analyze failure cause
If the client still fails, likely the Adapter does not correctly implement or map the target interface methods.
Final Answer:
The Adapter does not implement the target interface correctly. -> Option D
Hint: Adapter must match target interface exactly [OK]
Common Mistakes:
Confusing Decorator or Facade with Adapter errors
Assuming client code is always correct
Ignoring interface method signatures
5. You have a legacy payment system with a complex API. You want to provide a simple interface for new clients and also add logging features without changing the legacy code. Which combination of structural patterns should you use?
hard
A. Facade to simplify interface and Decorator to add logging
B. Decorator to simplify interface and Adapter to add logging
C. Adapter to add logging and Facade to simplify interface
D. Adapter to simplify interface and Decorator to add logging
Solution
Step 1: Identify pattern for simplifying complex API
Facade provides a simple interface to a complex system, ideal for the legacy payment system.
Step 2: Identify pattern for adding features without changing code
Decorator adds new responsibilities like logging dynamically without modifying original code.
Step 3: Combine patterns logically
Use Facade to simplify the interface for clients, then wrap with Decorator to add logging features.
Final Answer:
Facade to simplify interface and Decorator to add logging -> Option A
Quick Check:
Simplify = Facade, Add features = Decorator [OK]
Hint: Facade simplifies, Decorator adds features without code change [OK]
Common Mistakes:
Using Adapter to simplify interface instead of Facade
Confusing roles of Adapter and Decorator
Trying to add logging via Adapter
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.