728x90
어댑터 패턴은 한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환하는 패턴이다.
즉, 클라이언트의 입맛에 맞도록 한 인터페이스를 wrapping 하는 것이다.
비지니스 로직 수정으로 인한 코드 구조가 바뀔 때 어댑터 패턴을 사용하면 유용할 것 같다.
(내부 메소드를 커스텀할수도 있다. => 확장메소드 )
구조

▷ Target : Client에서 사용하는 인터페이스
▷Adaptee : Target형태로 변환하고자 하는 인터페이스
▷ Adapter : Target을 상속 받아 형태는 Target이지마 인자값으로 Adaptee를 사용함으로써 Adaptee를 Target형태로 변환해주는 클래스
시나리오
환자 정보 측정하는 기계 A와 B가 있다.
A기계는 2000년도에 출시 되었고 환자의 몸무게, 키, 혈압을 측정하는 기계이다.
B기계는 2020년도에 출시 되었고 환자의 몸무게, 키, 혈압, 심전도, 혈당을 측정하는 기계이다.
이 두 기계는 M 회사의 제품이며 두 기계를 모두 모니터링 할 수 있는 프로그램을 만드려고 한다.
구현
interface ICheckPatByA
{
void getHeight();
void getWeight();
void getPressure();
}
interface ICheckPatByB
{
void getHeight();
void getWeight();
void getPressure();
void getElectCardio();
void getBloodSugar();
}
class Patient1 : ICheckPatByA
{
public void getHeight()
{
Console.WriteLine("키가 큽니다.");
}
public void getPressure()
{
Console.WriteLine("혈압은 정상치입니다.");
}
public void getWeight()
{
Console.WriteLine("몸무게는 많이 나갑니다.");
}
}
class Patient2 : ICheckPatByB
{
public void getBloodSugar()
{
Console.WriteLine("혈당은 높습니다.");
}
public void getElectCardio()
{
Console.WriteLine("심전도는 정상치입니다.");
}
public void getHeight()
{
Console.WriteLine("키는 작습니다.");
}
public void getPressure()
{
Console.WriteLine("혈압은 정상치입니다.");
}
public void getWeight()
{
Console.WriteLine("몸무게는 정상치입니다.");
}
}
class Adapter : ICheckPatByB
{
ICheckPatByA mCheckPatA;
public Adapter(ICheckPatByA checkPatA)
{
mCheckPatA = checkPatA;
}
public void getBloodSugar()
{
Console.WriteLine("A기계 사용 - 혈당 측정 불가 ");
}
public void getElectCardio()
{
Console.WriteLine("A기계 사용 - 심전도 측정 불가 ");
}
public void getHeight()
{
mCheckPatA.getHeight();
}
public void getPressure()
{
mCheckPatA.getPressure();
}
public void getWeight()
{
mCheckPatA.getWeight();
}
}
class Program
{
static void Main(string[] args)
{
ICheckPatByA pat1 = new Patient1();
Console.WriteLine("환자 1 정보");
pat1.getHeight();
pat1.getWeight();
pat1.getPressure();
Console.WriteLine("============");
ICheckPatByB pat2 = new Patient2();
Console.WriteLine("환자 2 정보");
pat2.getHeight();
pat2.getWeight();
pat2.getPressure();
pat2.getElectCardio();
pat2.getBloodSugar();
Console.WriteLine("============");
//위의 처럼 할 경우 각 기계마다 모니터링할 비지니스 로직을 짜야한다.
//그래서 A를 B로 wrapping 해보자
ICheckPatByB pat1_1 = new Adapter(new Patient1());
Console.WriteLine("환자 1 정보");
pat1_1.getHeight();
pat1_1.getWeight();
pat1_1.getPressure();
pat1_1.getElectCardio();
pat1_1.getBloodSugar();
Console.ReadLine();
}
}728x90
'STUDY > Design Pattern' 카테고리의 다른 글
| 복합체 패턴(Composite Pattern) (0) | 2022.11.27 |
|---|---|
| 브릿지 패턴(Bridge Pattern) (0) | 2022.11.27 |
| 단일체 패턴(Singleton Pattern) (0) | 2022.11.27 |
| 원형 패턴 (Prototype Pattern) (0) | 2022.11.27 |
| 팩토리 메소드 패턴 (Factory Method Pattern) (0) | 2022.11.27 |