[Design pattern] Adapter 패턴
2023. 1. 22. 19:53ㆍIT/Design pattern
SMALL
Adapter 패턴이란?
GoF 책 에서는 이렇게 설명하고 있다
Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn’t otherwise because of incompatible interfaces.
한 클래스의 인터페이스를 클라이언트가 기대하는 다른 인터페이스로 변경한다. Adapter 패턴은 호환되지 않는 인터페이스로인해 다른 방법으로는 불가능 했던 클래스가 함께 동작하도록 할 수 있다.
Adapter 패턴에는 크게 두가지가 있다.
1. 객체 어댑터
- Target 인터페이스를 구현하기위해 Adaptee 클래스의 인스턴스에서 구체적인 메서드를 호출하는 방식
2. 클래스 어댑터
- 다중상속을 이용하여 Target 인터페이스와 Adaptee 를 동시에 재정의 또는 구현하는 방식
어떻게 활용하면 좋을까?
- 외부 라이브러리 또는 변경하기 쉽지 않은 코드의 인터페이스가 현재 사용중인것과 일치하지 않을 때 사용할 수 있다.
예제
Animal interface 를 구현한 Cat class 가 있는데 Human class 와는 호환되지 않는다. 이때 Human class를 Animal interface 와 동일한 인터페이스로 동작할 수 있도록 한다.
IAnimal interface
abstract class IAnimal {
/// 걷기
void walk();
/// 울부짖기
void growl();
}
Cat class
class Cat implements IAnimal {
@override
void growl() {
print('야옹~~~~');
}
@override
void walk() {
print('슈슈슉~~~');
}
}
Human class
class Human {
void walk() {
print('저벅저벅');
}
void say() {
print('하이~~');
}
}
HumanAdapter class
class HumanAdapter implements IAnimal {
final Human human;
HumanAdapter({required this.human});
@override
void growl() {
human.say();
}
@override
void walk() {
human.walk();
}
}
실행
void main(List<String> arguments) {
IAnimal cat = Cat();
IAnimal human = HumanAdapter(human: Human());
cat.growl();
cat.walk();
human.growl();
human.walk();
}
결과
/Users/satoshi/fvm/versions/3.3.9/bin/cache/dart-sdk/bin/dart --enable-asserts /Users/satoshi/Documents/aaa/bin/aaa.dart
야옹~~~~
슈슈슉~~~
하이~~
저벅저벅
Process finished with exit code 0
이와같이 Human 클래스가 Adapter에 들어가면서 Animal 인터페이스처럼 동작하는것을 확인할 수 있다.
LIST
'IT > Design pattern' 카테고리의 다른 글
[Design pattern] Proxy 패턴 (0) | 2023.01.24 |
---|