General Structure:
Target (IJsonAdapter): The interface that clients expect to use
Adaptee (LegacyXmlSystem): The existing class that needs to be adapted
Adapter (XmlToJsonAdapter): The class that bridges between Target and Adaptee
Client: The code that works with the Target interface
public interface IJsonAdapter { string GetJsonData(); } // Adaptee: Legacy system that needs to be adapted public class LegacyXmlSystem { public string GetXmlData() { return "<data> some XML data </data>"; } } // Adapter: Adapter implementation public class XmlToJsonAdapter : IJsonAdapter { private LegacyXmlSystem _xmlSystem; public XmlToJsonAdapter(LegacyXmlSystem xmlSystem) { _xmlSystem = xmlSystem; } public string GetJsonData() { string xmlData = _xmlSystem.GetXmlData(); // converting xml to json return "{ data: some XML data converted to JSON }"; } }
When to Use:
- Integrating legacy code with new systems
- Making incompatible interfaces work together
- Reusing existing classes with incompatible interfaces
- Converting data formats between systems
- Maintaining backward compatibility
Benefits:
- Promotes reusability of existing code
- Provides clean separation of concerns
- Makes incompatible code work together without modifying source
- Follows Single Responsibility Principle
- Enhances maintainability
Limitations:
- Can add complexity to the codebase
- May require creating multiple adapters for different interfaces
- Could impact performance due to additional layer
- Might make debugging more challenging
- Not suitable when extensive interface modifications are needed
The real-world example in the code shows adapting XML data to JSON format. The pattern is particularly useful in scenarios like:
- Database interface adaptations
- Third-party library integration
- API versioning
- File format conversions
- Payment gateway integrations
✨ You can find design pattern codes in this repository
✨ Exploring Design Patterns Other Posts
Top comments (0)