-
Notifications
You must be signed in to change notification settings - Fork 0
어댑터 패턴 (Adapter pattern)
Seyoung Oh edited this page Mar 24, 2021
·
2 revisions
클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴 출처: 위키백과
어댑터 패턴에는 2가지의 종류가 있다.
하나는 모든 객체 지향 언어에서 이용가능한 객체 어댑터
,
다른 하나는 다중상속이 가능한 C++
에서만 이용가능한 클래스 어댑터
다.

객체 어댑터(좌) / 클래스 어댑터(우)
출처: 위키피디아
객체 어댑터 | 클래스 어댑터 | |
---|---|---|
장점 | 상속이 아닌 구성을 사용하기 때문에 더 유연하다. | 1. Adapter가 Adaptee의 서브클래스이기 때문에 Adaptee의 행동을 오버라이드 할 수 있다. 2. Adaptee 객체를 만들지 않아도 된다. |
단점 | Adaptee 객체를 만들어야 사용가능하다. | 1. 상속을 이용하기 때문에 한 Adapter 클래스가 특정 Adatee 클래스에만 적용가능하다. 2. 다중상속이 지원되는 언어에서만 사용가능하다. |
출처: 서기리보이의 블로그
C to 라이트닝 젠더C# 출처: 위키피디아
Target
(추상) 인터페이스
interface TypeCPhone
{
void recharge();
void useTypeC();
}
Adaptee
(추상) 인터페이스
interface LightningPhone
{
void recharge();
void useLightning();
}
Adapter
클래스
class TypeCToLightningAdapter : TypeCPhone
{
private readonly LightningPhone lightningPhone;
public TypeCToLightningAdapter (LightningPhone lightningPhone)
{
this.lightningPhone = lightningPhone;
}
public void useTypeC()
{
Console.WriteLine("C타입 → 라이트닝 어댑터 연결");
lightningPhone.useLightning();
}
public void recharge()
{
lightningPhone.recharge();
}
}
Concrete
클래스들
class Iphone : LightningPhone
{
private bool connector;
public void useLightning()
{
connector = true;
Console.WriteLine("라이트닝 커넥터 인식됨");
}
public void recharge()
{
if (connector)
{
Console.WriteLine("※충전 시작");
Console.WriteLine("※충전 완료");
}
else
{
Console.WriteLine("※라이트닝을 연결해 주세요");
}
}
}
class Android : TypeCPhone
{
private bool connector;
public void useTypeC()
{
connector = true;
Console.WriteLine("C타입 커넥터 인식됨");
}
public void recharge()
{
if (connector)
{
Console.WriteLine("※충전 시작");
Console.WriteLine("※충전 완료");
}
else
{
Console.WriteLine("※C타입을 연결해 주세요");
}
}
}
메인 클래스
class MainClass
{
static void rechargeTypeCPhone(TypeCPhone phone)
{
phone.useTypeC();
phone.recharge();
}
static void rechargeLightningPhone(LightningPhone phone)
{
phone.useLightning();
phone.recharge();
}
static void Main(string[] args)
{
Android android = new Android(); //타겟
Iphone iPhone = new Iphone(); //어댑티
Console.WriteLine("안드로이드폰 충전중 : C타입 케이블");
rechargeTypeCPhone(android);
Console.WriteLine("\n아이폰 충전중 : 라이트닝 케이블");
rechargeLightningPhone(iPhone);
Console.WriteLine("\n아이폰 충전중 : C타입 케이블");
TypeCToLightningAdapter adapter = new TypeCToLightningAdapter(iPhone); //어댑터
rechargeTypeCPhone(adapter);
}
}
출력 결과
안드로이드폰 충전중 : C타입 케이블
C타입 커넥터 인식됨
※충전 시작
※충전 완료
아이폰 충전중 : 라이트닝 케이블
라이트닝 커넥터 인식됨
※충전 시작
※충전 완료
아이폰 충전중 : C타입 케이블
C타입 → 라이트닝 어댑터 연결
라이트닝 커넥터 인식됨
※충전 시작
※충전 완료
데코레이터 패턴 | 인터페이스을 바꾸지 않고 책임(기능)만 추가 |
어댑터 패턴 | 한 인터페이스를 다른 인터페이스로 변환 |
여러 출처를 바탕으로 최대한 오류를 범하지 않도록 작성하였으나, 이 페이지를 작성하는 저 또한 해당 학문을 공부하는 학생입니다.
∴해당 페이지의 정보를 맹신하지 마시길 바랍니다.
-
생성 패턴
-
구조 패턴
- 데코레이터 패턴 (Decorator pattern)
- 어댑터 패턴 (Adapter pattern)
- 퍼사드 패턴 (Facade pattern)
- 프록시 패턴 (Proxy pattern)
- 이터레이터, 컴포지트 패턴 (Iterator, Composite pattern)
-
동작 패턴
- 옵저버 패턴 (Observer pattern)
- 템플릿 메소드 패턴 (Template pattern)
- 커맨드 패턴 (Command pattern)
- 스트래티지 패턴 (Strategy pattern)
- 스테이트 패턴 (State pattern)
-
기타 패턴
- 컴파운드 패턴 (Compound pattern)
- 메소드 체이닝 (Method chaining)
- Dispose 패턴 (Dispose pattern)