프로그래밍/디자인패턴

디자인 패턴 - Adapter (Structural Pattern)

aiemag 2021. 2. 15. 23:15
반응형

Structural Pattern인 Adapter Pattern에 대해 정리합니다.

 

 

 


Definition

 

'이미 제공되어 있는 것'과 '필요한 것'사이의 '차이'를 없애주는 패턴

 

Adapter라는 naming과 같이 실생활에서의 예를 들자면 기존 사용하던 220V 플러그를 110V 콘센트에 꽂아서 사용하려면, 110V Adapter가 있어야 합니다. 이 때 110V Adapter의 역할을 만들어서 사용할 수 있도록 하는 Pattern을 Adapter Pattern이라 합니다.

 

Adapter Pattern은 Structural Pattern 에 해당합니다.

 

Scope 분류로 보면, Class 에 해당하는 Adapter 패턴은 상속을 이용, Object에 해당하는 Adapter 패턴은 위임을 이용합니다.

 

 


Class Diagram

Abstract Adapter

Adapter는 Adaptee를 직접 상속받고, Client가 사용할 Target interface의 method를 구현합니다.

Adapter에서 구현한 targetMethod에서 Adaptee의 adapteeMethod를 사용할 수 있도록 합니다.

 

Object Adapter

Adapter는 Client가 사용할 Target 의 interface를 구현합니다.

Adapter에서 구현한 targetMethod에서 Adaptee의 adapteeMethod를 직접 사용할 수 있도록 Adaptee의 instance를 가집니다.

 


Sample Case

 

다음은 제가 만들어 본 시나리오에서 Adapter 패턴을 적용해 보았습니다. 

 

최대한 필요한 내용만 간결하게 표현하기 위해서 최소한의 class와 method를 포함하였습니다.

 

Class Adapter

 

Scenario

새로운 Computer가 출시되었는데, 최근 생산되는 PowerConnector는 220V Type만 지원이 됩니다.

 

외국에 이 Computer를 수출하려고 하는데, 해당 국가에서는 110V Type의 ElectricOutlet(전기 콘센트)만 지원된다고 하네요.

 

이런 상황에서 PowerConnector를 수출용으로 110V Type으로 생산하기에는 너무나 큰 Cost가 발생할 것 같습니다.

 

그래서, 우리는 Adapter 라는 것을 만들어 기존 220V Type의 PowerConnector를 사용하면서도, 수출 국가의 ElectricOutlet(콘센트)에도 대응되도록 하도록 합니다.

 

Class Diagram

 

Code

위의 Class Diagram을 구현한 code입니다.

1
2
3
4
5
6
7
public class Computer {
 
    public static void main(String[] args) {
        PowerConnector pc = new Adapter();
        pc.connectTo220VType();
    }
}
cs

 

1
2
3
public interface PowerConnector {
    public abstract void connectTo220VType();
}
cs

 

1
2
3
4
5
6
public class ElectricOutlet {
    
    public void connectTo110VType() {
        System.out.println("connected to 110V Type");
    }
}
cs

 

1
2
3
4
5
6
public class Adapter extends ElectricOutlet implements PowerConnector{
        
    public void connectTo220VType() {
        connectTo110VType();
    }
}
cs

 

실행 결과 Computer의 PowerConnector가 무사히 110V 콘센트에 연결되었습니다.

 

 

Object Adapter

 

시나리오는 Class Adapter와 동일합니다.

 

Class Diagram

Class Adapter와 다르게 Adapter class에서 ElectricOutlet의 instance를 직접 포함하여 사용합니다.

 

Code

Class Adapter의 code에서 Adapter class 코드만 변경이 있습니다.

 

1
2
3
4
5
6
7
public class Adapter implements PowerConnector{
        
    ElectricOutlet electricOutlet;
    public void connectTo220VType() {
        electricOutlet.connectTo110VType();
    }
}
cs

 

실행 결과 역시 Class Adapter와 동일합니다.

 

반응형