본문 바로가기

DesignPattern

Adapter Pattern

Adapter Pattern

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

 

Wrapper 패턴이라고도 불리운다.

  •  클래스에 의한 Adapter 패턴(상속을 사용한 Adapter 패턴)
  •  인스턴스에 의한 Adapter 패턴(위임을 사용한 Adapter 패턴)

 

*대응관계

제공되고 있는것 – 교류 100볼트 – Banner 클래스  (showWithParen, showWithAster)

교환장치  – 어댑터 – PrintBanner 클래스

필요한것 – 직류12볼트 – Print 인터페이스 (printWeak, printStrong)

AdapterUML

  1.  상속을 사용한 Adapter 패턴

Banner.java

package Adapter;
//showWithParen, ShowWithAster
public class Banner {

private String string;
public Banner(String string){
this.string=string;
}
public void showWithParen(){
System.out.println(“(“+string+”)”);
}
public void showWithAster(){
System.out.println(“*”+string+”*”);
}

}

 

 

Print.java

package Adapter;

public interface Print {

public abstract void PrintWeak();
public abstract void PrintStrong();

}

 

PrintBanner.java (어댑터클래스)

package Adapter;

public class PrintBanner extends Banner implements Print{

public PrintBanner(String string) {
super(string);
// TODO Auto-generated constructor stub
}

public void PrintWeak(){
showWithAster();
}

@Override
public void PrintStrong() {
// TODO Auto-generated method stub

showWithParen();
}

}

 

 

package Adapter;
public class Main {
public static void main(String [] args){
Print p = new PrintBanner(“Hello”);
p.PrintStrong();
p.PrintWeak();
}
}

 

2.위임을 사용한 Adapter 패턴

package Adapter;

public class PrintBanner extends Printclass{
private Banner banner;
public PrintBanner(String string) {

this.banner = new Banner(string);
}

public void PrintWeak(){
banner.showWithAster();
}

public void printStrong() {
// TODO Auto-generated method stub

banner.showWithParen();
}

@Override
public void printWeak() {
// TODO Auto-generated method stub

}

}

 

package Adapter;

public interface Print {

public abstract void PrintWeak();
public abstract void PrintStrong();

}

패턴의 등장인물

  1.  Target(대상)의 역할  – 지금 필요한 메소드를 결정함, Print 인터페이스(상속),Print(위임)이 이역할을 대신 함
  2. Client (의뢰자)의 역할 – Target 역할의 메소드를 사용. Main클래스 같은거
  3. Adaptee(개조되는 쪽) – 이미준비되어 있는 메소드 같은것
  4. . Adapter – 교류장치 같은거

 

왜 ? 

프로젝트에서 이미 만들어진 소스를 활용하는 경우가 많고 , 이미 만들어진 소스의 경우 버그가 많이 없다. 디버깅을 할때도 Adapter를 중점적으로 조사하면 된다.(이미 만들어지고 많이 활용된 소스는 버그가 대부분 없기 때문)

 

버전업과 호환성

구 버전과 신버전의 호환성문제 때문에, 신 버전만 유지와 보수를 하고 싶을 때, adaptee를 신버전으로 하고, 구버전을 target으로 한다. 단 , target 역할과 adaptee의 역할이 지나치게 동떨어지면 사용할 수 없다.

 

연습문제

Print p  = new PrintBanner(“Hello”);

왜 PrintBanner 형의 변수에 대입하지 않나 ?

요는 Print 인터페이스를 사용하여 인터페이스에서 의도하고 있는 메소드  만을 사용할 수있게된다.

이는 설계에서 목적에 맞는 사용방법을 유도 한다. ~~~~~~~


'DesignPattern' 카테고리의 다른 글

Clean Architecture 번역  (0) 2017.12.26
Singlton pattern  (0) 2016.05.18
template pattern  (0) 2016.05.18
Iterator Pattern  (0) 2016.05.18
Factory pattern  (0) 2016.05.18