어댑터 패턴이란?
- 기존의 코드나 클래스가 호환되지 않는 인터페이스를 가질 때, 호환 가능한 인터페이스로 변환하여 다양한 시스템과의 통합
- 새로운 시스템이나 클래스를 변경하지 않고, 기존 시스템과 통합할 수 있도록 함
구성 요소
1. Client (클라이언트)
어댑터를 통해 서비스나 기능을 사용하려는 코드
2. Adapter (어댑터)
호환되지 않는 인터페이스를 변환하는 역할. 주로 변환하고자 하는 인터페이스를 구현하거나 상속하여 변환
3. Target (타겟)
클라이언트가 원하는 인터페이스
4. Adaptee (어댑티)
변환하려는 기존 인터페이스를 가진 클래스, 클라이언트가 바로 사용할 수 없음
패턴 종류
1. Class Adapter(클래스 어댑터)
어댑터가 다중 상속을 사용하여 기존 클래스의 인터페이스를 변환 (C++)
2. Object Adapter (객체 어댑터)
어댑터가 기존 클래스의 인스턴스를 참조하여 해당 클래스의 인터페이스 변환 (C#, Java)
어댑터 패턴 예제 (C++)
1. #include <iostream>
2. using namespace std;
3.
4. // 1. 기존 인터페이스 (Target)
5. class Bird {
6. public:
7. virtual void fly() = 0;
8. virtual void makeSound() = 0;
9. };
10.
11. // 2. 기존 클래스 (Adaptee)
12. class Duck {
13. public:
14. void quack() {
15. cout << "Duck is quacking!" << endl;
16. }
17.
18. void swim() {
19. cout << "Duck is swimming!" << endl;
20. }
21. };
22.
23. // 3. 어댑터 (Adapter)
24. class DuckAdapter : public Bird {
25. private:
26. Duck* duck; // Duck 인스턴스를 참조
27.
28. public:
29. DuckAdapter(Duck* d) {
30. duck = d;
31. }
32.
33. void fly() override {
34. // Duck은 fly 메서드를 구현하지 않지만, 대신 swim을 호출하여 대체할 수 있음
35. duck->swim();
36. }
37.
38. void makeSound() override {
39. // Duck은 quack 메서드를 사용
40. duck->quack();
41. }
42. };
43.
44. int main() {
45. Duck* duck = new Duck();
46. Bird* bird = new DuckAdapter(duck); // DuckAdapter로 Duck을 Bird로 변환
47.
48. // 클라이언트는 Bird 인터페이스를 통해 Duck 객체를 사용
49. bird->fly();
50. bird->makeSound();
51.
52. delete duck;
53. delete bird;
54.
55. return 0;
56. }
어댑터 패턴 장점
1. 기존 코드 변경 없이 통합
2. 유연한 클래스 연결
3. 다양한 객체와의 호환성 증가
어댑터 패턴 단점
1. 추가적인 클래스 생성
2. 간접적인 호출
3. 어댑터가 많을 수 있음
'Unity > 디자인 패턴' 카테고리의 다른 글
| 디자인 패턴 (구조 패턴) - 데코레이터 패턴 (Decorator Pattern) (0) | 2025.08.30 |
|---|---|
| 디자인 패턴 (구조 패턴) - 컴포지트 패턴 (Composite Pattern) (0) | 2025.08.30 |
| 디자인 패턴 (생성 패턴) - 빌더 패턴 (Builder Pattern) (0) | 2025.08.30 |
| 디자인 패턴 (생성 패턴) - 추상 팩토리 패턴 (Abstract Factory Pattern) (0) | 2025.08.30 |
| 디자인 패턴 (생성 패턴) - 싱글톤 패턴 (Singleton Pattern) (0) | 2025.08.30 |