Adapter Pattern (어댑터 패턴)
Adapters Pattern
정의 : 한 class의 interface를 client에서 필요로 하는 다른 interface로 변환한다. Adapter를 이용하면 interface 호환성문제로 쓸 수 없는 class들을 연결해서 쓸 수 있다.
위 그림과 같이 Adapter의 소스만 변경하여 Existing System과 Vender Class를 연결해 준다.
1. Class Adapter Pattern
A. 장점 : Adapter 전체를 다시 구현할 필요가 없다.
B.
단점 : 상속을 활용하기 때문에 유연성이 떨어진다.
(java는 다중상속 -지원
X)
C. Class Adapter에서는 다중 상속을 이용하기 때문에 JAVA에서는 사용할 수 없다 (간접적 다중상속 지원 à Interface를 이용)
2. Object Adapter Pattern
A. 장점 : Composition을 사용하기 때문에 유연성이 뛰어나다.
B. 단점 : Adapter Class의 대부분의 코드를 구현해야 하기 때문에 효율성이 떨어진다.
사용방법
1. Client에서 Target Interface를 사용하여 method를 호출함으로써 adapter에 요청을 한다.
2. Adapter에서는 adapter interface를 사용하여 그 요청을 adapter에 대한 하나 이상의 메소드를 호출로 변환한다.
3. Client에서는 호출 결과를 받긴 하지만 중간에 Adapter의 역할이 있었는지 전혀 알 수 없다.
기존의 Duck interface
public interface Duck {
public void quack();
public void fly();
}
Duck interface를 implement하는 MallardDuck
public class MallardDuck implements Duck{
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("Quack");
}
@Override
public void quack() {
// TODO Auto-generated method stub
System.out.println("I'm flying");
}
}
하지만 turkey가 오고싶다. 그래서 interface를 만들어준다.
public interface Turkey {
public void gobble();
public void fly();
}
그 후, Duck interface를 사용하기 위해 Adapter를 사용한다.
public class TurkeyAdapter implements Duck{
Turkey turkey;
public TurkeyAdapter(Turkey turkey){
this.turkey=turkey;
}
@Override
public void quack() {
turkey.gobble();
}
@Override
public void fly() {
turkey.fly();
}
}
Turkey interface를 implements 하는 WildTurkey
public class WildTurkey implements Turkey{
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("Gobble gobble");
}
@Override
public void gobble() {
// TODO Auto-generated method stub
System.out.println("I'm flying a short distance");
}
}
Main 소스
public class DuckTestDrive {
public static void main(String[] args) {
MallardDuck duck = new MallardDuck();
WildTurkey turkey = new WildTurkey();
Duck turkeyAdapter = new TurkeyAdapter(turkey);
System.out.println("The turkey says...");
turkey.gobble();
turkey.fly();
System.out.println("The Duck says...");
testDuck(duck);
System.out.println("The TurkeyAdapter says...");
testDuck(turkeyAdapter);
}
public static void testDuck(Duck duck){
duck.quack();
duck.fly();
}
}
결과 화면
The turkey says...
I'm flying a short distance
Gobble gobble
The Duck says...
I'm flying
Quack
The TurkeyAdapter says...
I'm flying a short distance
Gobble gobble
UML
'SW > DesignPattern' 카테고리의 다른 글
Template Method Pattern (템플릿메소드패턴) (0) | 2017.09.11 |
---|---|
Facade Pattern (퍼사드 패턴) (0) | 2017.09.07 |
Command Pattern (커맨드 패턴) (0) | 2017.09.07 |
Singleton Pattern (싱글턴 패턴) (0) | 2017.09.05 |
Factory Pattern (팩토리 패턴) (0) | 2017.09.05 |