Adapter Pattern
이미 제공되어 있는 것 과 필요한 것 의 차이를 없애주는 디자인 패턴
Wrapper 패턴이라고도 불리운다.
- 클래스에 의한 Adapter 패턴(상속을 사용한 Adapter 패턴)
- 인스턴스에 의한 Adapter 패턴(위임을 사용한 Adapter 패턴)
*대응관계
제공되고 있는것 – 교류 100볼트 – Banner 클래스 (showWithParen, showWithAster)
교환장치 – 어댑터 – PrintBanner 클래스
필요한것 – 직류12볼트 – Print 인터페이스 (printWeak, printStrong)
상속을 사용한 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 stubshowWithParen();
}}
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 stubbanner.showWithParen();
}@Override
public void printWeak() {
// TODO Auto-generated method stub}
}
package Adapter;
public interface Print {
public abstract void PrintWeak();
public abstract void PrintStrong();}
패턴의 등장인물
- Target(대상)의 역할 – 지금 필요한 메소드를 결정함, Print 인터페이스(상속),Print(위임)이 이역할을 대신 함
- Client (의뢰자)의 역할 – Target 역할의 메소드를 사용. Main클래스 같은거
- Adaptee(개조되는 쪽) – 이미준비되어 있는 메소드 같은것
- . 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 |