# Adapter Pattern
## Definition
The Adapter Pattern allows objects with incompatible interfaces to work together by
wrapping an existing class with a new interface.
## How It Works
- The Adapter implements the target interface and translates calls to the adaptee
(the class being adapted).
- Useful for integrating legacy code, third-party libraries, or APIs with different
interfaces.
## UML Diagram
```
+----------------+ uses +----------------+
| Client |-------------->| Adapter |
+----------------+ +----------------+
|
v
+----------------+
| Adaptee |
+----------------+
```
## Java Code Example
```java
// Target interface
public interface MediaPlayer {
void play(String filename);
}
// Adaptee
public class VLCPlayer {
public void playVLC(String filename) {
[Link]("Playing VLC file: " + filename);
}
}
// Adapter
public class VLCAdapter implements MediaPlayer {
private VLCPlayer vlcPlayer = new VLCPlayer();
public void play(String filename) {
[Link](filename);
}
}
// Usage
MediaPlayer player = new VLCAdapter();
[Link]("[Link]");
```
## Spring Boot Real Use Cases
1. **Integrating legacy payment gateways:**
- Adapter wraps legacy API to expose a modern interface.
2. **Spring Data JPA Repositories:**
- Spring's `JpaRepository` adapts your entity to a standard CRUD interface.
3. **REST API versioning:**
- Adapter translates v1 requests to v2 service calls.
4. **External service integration:**
- Adapter wraps a third-party library to fit your service's interface.
## Spring Boot Example
```java
// Suppose you have a legacy SOAP client
public class LegacySoapClient {
public String fetchData() { return "data from SOAP"; }
}
// Adapter for REST controller
@Component
public class SoapClientAdapter implements DataProvider {
@Autowired
private LegacySoapClient legacySoapClient;
public String getData() {
return [Link]();
}
}
// Controller uses the adapter
@RestController
public class DataController {
@Autowired
private DataProvider dataProvider;
@GetMapping("/data")
public String getData() {
return [Link]();
}
}
```
## Summary
- Use Adapter to integrate incompatible interfaces.
- Common in Spring Boot for legacy integration, API versioning, and third-party
libraries.