The Adapter pattern allows two incompatible interfaces to work together by converting the interface of one class into another expected by clients.
Click to reveal answer
beginner
Why is the Adapter pattern useful in system design?
It helps reuse existing code with incompatible interfaces without changing their source code, promoting flexibility and easier integration.
Click to reveal answer
intermediate
What are the main components of the Adapter pattern?
1. Target: The interface expected by the client. 2. Adaptee: The existing incompatible interface. 3. Adapter: Converts Adaptee's interface to Target's interface.
Click to reveal answer
intermediate
How does the Adapter pattern differ from the Decorator pattern?
Adapter changes an interface to match another, while Decorator adds new behavior to an object without changing its interface.
Click to reveal answer
beginner
Give a real-life analogy for the Adapter pattern.
An electrical plug adapter lets a plug from one country fit into a socket of another country by converting the plug shape, similar to how software adapters convert interfaces.
Click to reveal answer
What role does the Adapter play in the Adapter pattern?
ARemoves unused methods
BAdds new features to an object
CCreates new objects
DConverts one interface to another compatible interface
✗ Incorrect
The Adapter converts the interface of the Adaptee to the Target interface expected by the client.
Which component in the Adapter pattern is the existing incompatible interface?
AAdaptee
BAdapter
CClient
DTarget
✗ Incorrect
The Adaptee is the existing interface that is incompatible with the client’s expected interface.
The Adapter pattern is mainly used to:
AAllow incompatible interfaces to work together
BAdd new behavior to objects
CCreate new classes dynamically
DManage object lifecycles
✗ Incorrect
Adapter pattern enables two incompatible interfaces to communicate by converting one interface to another.
Which of the following is NOT a benefit of using the Adapter pattern?
ACode reuse without modification
BInterface compatibility
CAdding new methods to existing classes
DFlexibility in integrating legacy systems
✗ Incorrect
Adapter does not add new methods; it only converts interfaces.
In a real-world example, an electrical plug adapter is similar to which software design pattern?
ASingleton
BAdapter
CObserver
DFactory
✗ Incorrect
An electrical plug adapter converts one plug type to another, just like the Adapter pattern converts interfaces.
Explain the Adapter pattern and its main components with a simple example.
Think about how two incompatible things can work together using a converter.
You got /5 concepts.
Describe a scenario where using the Adapter pattern improves system design.
Consider integrating old and new systems.
You got /3 concepts.
Practice
(1/5)
1. What is the main purpose of the Adapter pattern in system design?
easy
A. To improve the performance of a system by caching results
B. To allow incompatible interfaces to work together by converting one interface to another
C. To store data persistently in a database
D. To create multiple instances of a class
Solution
Step 1: Understand the Adapter pattern role
The Adapter pattern acts as a bridge between two incompatible interfaces, allowing them to communicate.
Step 2: Compare with other options
The other options describe different design goals unrelated to interface compatibility.
Final Answer:
To allow incompatible interfaces to work together by converting one interface to another -> Option B
Quick Check:
Adapter pattern = interface compatibility [OK]
Hint: Adapter = bridge between incompatible interfaces [OK]
Common Mistakes:
Confusing Adapter with Singleton or Factory patterns
Thinking Adapter improves performance directly
Assuming Adapter stores data
2. Which of the following is the correct way to declare an Adapter class in a typical object-oriented language?
easy
A. class Adapter implements Adaptee { private TargetInterface target; }
B. class Adapter extends Adaptee implements TargetInterface { }
C. class Adapter extends TargetInterface { private Adaptee adaptee; }
D. class Adapter implements TargetInterface { private Adaptee adaptee; }
Solution
Step 1: Identify Adapter pattern structure
The Adapter class implements the TargetInterface and holds a reference to the Adaptee to delegate calls.
Step 2: Analyze options
class Adapter implements TargetInterface { private Adaptee adaptee; } correctly shows Adapter implementing TargetInterface and containing Adaptee. The other options misuse inheritance or interfaces.
Final Answer:
class Adapter implements TargetInterface { private Adaptee adaptee; } -> Option D
Using inheritance incorrectly instead of composition
Confusing which interface to implement
Swapping adaptee and target roles
3. Given this Adapter pattern code snippet, what will be the output?
class Adaptee {
String specificRequest() { return "Adaptee response"; }
}
interface Target {
String request();
}
class Adapter implements Target {
private Adaptee adaptee = new Adaptee();
public String request() {
return adaptee.specificRequest();
}
}
public class Main {
public static void main(String[] args) {
Target target = new Adapter();
System.out.println(target.request());
}
}
medium
A. Adaptee response
B. Target response
C. Compilation error
D. Runtime exception
Solution
Step 1: Trace method calls in Adapter
The Adapter's request() calls adaptee.specificRequest(), which returns "Adaptee response".
Step 2: Check main method output
Main creates Adapter as Target and prints target.request(), so output is "Adaptee response".
Final Answer:
Adaptee response -> Option A
Quick Check:
Adapter delegates request() to adaptee.specificRequest() [OK]
Hint: Adapter.request() returns adaptee.specificRequest() result [OK]
Common Mistakes:
Expecting 'Target response' instead of adaptee's
Assuming compilation or runtime errors without cause
Confusing method names
4. Identify the error in this Adapter pattern implementation:
interface Target {
void request();
}
class Adaptee {
void specificRequest() { System.out.println("Adaptee called"); }
}
class Adapter implements Target {
Adaptee adaptee = new Adaptee();
public void request() {
specificRequest();
}
}
medium
A. Adapter calls specificRequest() without referencing adaptee instance
B. Adaptee should implement Target interface
C. Adapter should extend Adaptee instead of implementing Target
D. Target interface method signature is incorrect
Solution
Step 1: Review Adapter's request() method
Adapter calls specificRequest() directly, but specificRequest() belongs to Adaptee instance, so it should call adaptee.specificRequest().
Step 2: Validate other options
Adaptee does not need to implement Target. Adapter implements Target correctly. Target interface method is correct.
Final Answer:
Adapter calls specificRequest() without referencing adaptee instance -> Option A
Quick Check:
Adapter must call adaptee.specificRequest() [OK]
Hint: Call adaptee methods via adaptee instance inside Adapter [OK]
Common Mistakes:
Calling adaptee methods without instance prefix
Misusing inheritance instead of composition
Changing Target interface unnecessarily
5. You need to integrate a legacy payment system with a new e-commerce platform. The legacy system has a method processLegacyPayment(), but the platform expects processPayment(). How should you apply the Adapter pattern to solve this?
hard
A. Create a new payment system and discard the legacy system
B. Modify the legacy system to rename processLegacyPayment() to processPayment()
C. Create an Adapter class implementing the platform's payment interface and inside it call processLegacyPayment() of the legacy system
D. Use inheritance to make the legacy system extend the platform's payment interface
Solution
Step 1: Understand integration requirement
The platform expects processPayment(), but legacy system only has processLegacyPayment().
Step 2: Apply Adapter pattern
Create an Adapter that implements the platform interface and inside calls legacy's processLegacyPayment() to adapt calls without changing legacy code.
Step 3: Evaluate other options
Modifying the legacy code is risky. Discarding the legacy system is costly. Using inheritance is not possible if the legacy system is not designed for it.
Final Answer:
Create an Adapter class implementing the platform's payment interface and inside it call processLegacyPayment() of the legacy system -> Option C
Quick Check:
Adapter wraps legacy method to match platform interface [OK]
Hint: Adapter wraps legacy calls to match new interface [OK]
Common Mistakes:
Changing legacy code directly
Ignoring Adapter pattern benefits
Trying inheritance when not supported
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.