한 클래스의 인터페이스를 다른 클래스에서 사용하고자 할 때, 어댑터를 통해서 호환성 문제를 해결한다.
예전에 만든 오리 인터페이스와 객체가 있다. 그 오리 인터페이스에 칠면조를 넣으려면 어댑터라는 특수한 객체를 통해 넣어줘야한다.
코드를 살펴보자
package bird;
public interface Duck {
public void fly();
public void Quack();
}
package bird;
public class MallardDuck implements Duck{
@Override
public void fly() {
System.out.println("Duck Flying");
}
@Override
public void Quack() {
System.out.println("Duck Making Noise");
}
}
package bird;
public interface Turkey {
public void gobble();
public void fly();
}
package bird;
public class WildTurkey implements Turkey {
@Override
public void gobble() {
System.out.println("Gobble");
}
@Override
public void fly() {
System.out.println("WildTurkey Flying");
}
}
이 때, 칠면조를 오리에 넣으려면 어댑터라는 다른 클래스가 필요하다
package bird;
public class TurkeyAdaptor implements Duck{
Turkey turkey;
public TurkeyAdaptor(Turkey turkey) {
this.turkey = turkey;
}
@Override
public void fly() {
for (int i = 0; i < 5; i++) {
turkey.fly();
}
}
@Override
public void Quack() {
turkey.gobble();
}
}
이를 실행하는 드라이버코드는 다음과 같다.
package bird;
public class Driver {
public static void main(String[] args) {
MallardDuck md = new MallardDuck();
WildTurkey wt = new WildTurkey();
Duck turkeyAdaptor = new TurkeyAdaptor(wt);
System.out.println("Turkey");
wt.gobble();
wt.fly();
System.out.println("Duck");
md.Quack();
md.fly();
System.out.println("Adaptor");
turkeyAdaptor.fly();
turkeyAdaptor.Quack();
}
}
초기 컬렉션 형식인 Vector, Stack, Hashtable등이 그 예시이다. Enumeration안에는 hasMoreElements, nextElements같은 항목이 있다.
위의 예시와 마찬가지로 항목들 내용을 확인하는 기능을 한다.
데코레이터 = 한 인터페이스를 다른 인터페이스로 변환
어댑터 = 인터페이스는 놔두고 기능만 추가
퍼사드 = 인터페이스를 간단하게 바꿈
어떤 서브시스템의 일련의 통합시스템 인터페이스를 통합하는 또 다른 인터페이스를 제공한다.
이는 최소 지식 디자인 원칙을 다른것이다. 너무 많은 권한보다는 최소한의 권한을 주는것이 좋다.
++ 최소 지식 원칙 (데메테르의 원칙, Law of Demeter) : 정말 관련있는 객체와만 관계를 맺어라
이 종류에 속하는 메소드만 호출해야지, 다른 것을 호출하면 안된다.
우리는 전자레인지의 버튼만 누르면 알아서 작동한다.
이는 퍼사드 패턴을 통해 제조사에서 각 버튼에 기능을 줬기 때문이다.
이 글 참조