특정 클래스 인터페이스를 클라이언트에서 요구하는 다른 인터페이스로 변환해주는 패턴. 인터페이스가 호환되지 않아 같이 쓸 수 없었던 클래스를 사용할 수 있게 도와줌.
호환되지 않는 인터페이스를 사용하는 클라이언트를 그대로 사용할 수 있음 -> 클라이언트와 구현된 인터페이스를 분리 가능. 향후 인터페이스가 바뀌어도 그 변경 내역은 어댑터에 캡슐화 되어서 클라이언트는 바뀔 필요가 없음
오리와 칠면조의 다른 인터페이스
//오리
interface Duck {
public void quack(); // 오리는 꽉꽉 소리를 낸다
public void fly();
}
class MallardDuck implements Duck {
@Override
public void quack() {
System.out.println("Quack");
}
@Override
public void fly() {
System.out.println("I'm flying");
}
}
// 칠면조
interface Turkey {
public void gobble(); // 칠면조는 골골거리는 소리를 낸다
public void fly();
}
class WildTurkey implements Turkey {
@Override
public void gobble() {
System.out.println("Gobble gobble");
}
@Override
public void fly() {
System.out.println("I'm flying a short distance");
}
}
어댑터
class TurkeyAdapter implements Duck {
Turkey turkey;
public TurkeyAdapter(Turkey turkey) {
this.turkey = turkey;
}
@Override
public void quack() {
turkey.gobble();
}
@Override
public void fly() {
// 칠면조는 멀리 날지 못하므로 다섯 번 날아서 오리처럼 긴 거리를 날게 한다
for (int i = 0; i < 5; i++) {
turkey.fly();
}
}
}
Turkey를 TurkeyAdapter 라는 어댑터를 통해 Duck처럼 사용
어떤 서브시스템의 일련의 인터페이스에 대해 통합된 인터페이스를 제공.
퍼사드에서 고수준 인터페이스를 정의하므로 서브시스템을 더 쉽게 사용할 수 있음. 즉, 단순화된 인터페이스를 통해 서브시스템을 더 쉽게 사용할 수 있도록 하기 위해 쓰는 패턴.
Facade
//GoOffice.java
public class GoOffice {
public void goToWork() {
Wash wash = new Wash();
Breakfast breakfast = new Breakfast();
Move move = new Move();
wash.brushTeeth();
wash.shower();
breakfast.eat();
breakfast.water();
move.bus();
}
}
Subsystem Classes
// Wash.java
public class Wash {
public void brushTeeth() {
System.out.println("Brush my teeth");
}
public void shower() {
System.out.println("Take a shower");
}
}
// Breakfast.java
public class Breakfast {
public void eat() {
System.out.println("Have breakfast");
}
public void water() {
System.out.println("Drink water");
}
}
// Move.java
public class Move {
public void bus() {
System.out.println("Take the bus");
}
}
Test
//Client.java
public class Client {
public static void main(String[] args) {
GoOffice goOffice = new GoOffice();
goOffice.goToWork();
}
}
Result
Adapter 패턴 : 한 인터페이스를 다른 인터페이스로 변환 (for 호환성)인터페이스를 변경해서 클라이언트에서 필요로 하는 인터페이스로 적응시키기 위한 용도.
Facade 패턴 : 인터페이스를 간단하게 바꿈 (for 간편함)어떤 서브시스템에 대한 간단한 인터페이스를 제공하기 위한 용도.