어댑터 패턴
데코레이터 패턴은 객체를 래퍼로 감싸서 새로운 역할을 부여함
다른 목적으로 객체를 감싼다.
실제와 다른 인터페이스를 가진 것처럼
기존시스템에서 새로운 업체에서 제공한 클래스 라이브러리를 사용해야한다고 하면, 사용하는 인터페이스가 기존 업체에서 사용하던 인터페이스가 다르다.
기존코드를 바꿔서 해결할 수 없는 상황일경우, 업체에서 공급받은 클래스도 변경할 수 없다면?
새로 사용하기로 한 업체에서 사용하는 인터페이스를 기존에 사용하던 인터페이스에 적응시켜주는 클래스를 만들 수 있다.
어댑터는 클라이언트로부터 요청을 받아서 새로운 업체에서 제공하는 클래스에서 받아들일 수 있는 형태의 요청으로 변환시켜주는 중개인 역할을 한다.
예)
package patterns.adaptor;
public interface Duck {
void quack();
void fly();
}
package patterns.adaptor;
public class MallardDuck implements Duck{
@Override
public void quack() {
System.out.println("Quack");
}
@Override
public void fly() {
System.out.println("far fly");
}
}
package patterns.adaptor;
public interface Turkey {
void gobble();
void fly();
}
package patterns.adaptor;
public class WildTurkey implements Turkey{
@Override
public void gobble() {
System.out.println("Gobble gobble");
}
@Override
public void fly() {
System.out.println("short fly");
}
}
package patterns.adaptor;
public class TurkeyAdapter implements Duck {
private Turkey turkey;
public TurkeyAdapter(Turkey turkey) {
this.turkey = turkey;
}
@Override
public void quack() {
turkey.gobble();
}
@Override
public void fly() {
turkey.fly();
}
}
package patterns.adaptor;
public class DuckTestDriven {
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);
}
private static void testDuck(Duck duck) {
duck.quack();
duck.fly();
}
}
사용방법
1. 클라이언트에서 타켓 인터페이스를 사용하여 메서드를 호출함으로써 어댑터에 요청을 한다.
2. 어댑터에서는 어탭티 인터페이스를 사용하여 그 요청을 어댑티에 대한 (하나 이상의) 메서드 호출로 변환한다.
3. 클라이언트에서는 호출 결과를 받기 하지만 중간에 어탭터가 껴 있는지 전혀 알지 못한다.
어댑터 패턴의 정의
- 한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환한다.
어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸수 없는 클래스들을 연결해서 쓸 수 있다.
객체 어댑터
-> 어댑터를 새로 바뀐 인터페이스로 감쌀때는 객체구성을 사용한다. 어댑티의 어떤 서브클래스에 대해서도 어댑터를 쓸수 있는 장점이 있다.
클래스 어댑터
-> 다중 상속이 필요한데, 자바에서는 다중 상속이 불가. 다중상속이 가능한 언어를 사용하는 경우에도 클래스 어댑터를 써야하는 경우가 생길수도 있다.
예)
package patterns.adaptor;
import java.util.Enumeration;
import java.util.Iterator;
public class EnumerationIterator implements Iterator {
Enumeration enumeration;
public EnumerationIterator(Enumeration enumeration) {
this.enumeration = enumeration;
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
@Override
public boolean hasNext() {
return enumeration.hasMoreElements();
}
@Override
public Object next() {
return enumeration.nextElement();
}
}
'JAVA > Design Patterns' 카테고리의 다른 글
9.이터레이터 패턴 (0) | 2018.12.13 |
---|---|
8.템플릿 메서드 패턴 (0) | 2018.12.10 |
6.커맨드 패턴 (0) | 2018.12.06 |
5. 싱글톤 패턴 (0) | 2018.12.06 |
4. 팩토리 메서드 패턴 / 추상 팩토리 패턴 (0) | 2018.12.05 |