디자인 패턴: 어댑터 패턴 & 퍼사드 패턴

DanChu 🌟·2022년 7월 22일
0

어댑터 패턴

특정 클래스 인터페이스를 클라이언트에서 요구하는 다른 인터페이스로 변환해주는 패턴. 인터페이스가 호환되지 않아 같이 쓸 수 없었던 클래스를 사용할 수 있게 도와줌.

호환되지 않는 인터페이스를 사용하는 클라이언트를 그대로 사용할 수 있음 -> 클라이언트와 구현된 인터페이스를 분리 가능. 향후 인터페이스가 바뀌어도 그 변경 내역은 어댑터에 캡슐화 되어서 클라이언트는 바뀔 필요가 없음


어댑터 패턴 예시

오리와 칠면조의 다른 인터페이스

//오리

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처럼 사용


어댑터 패턴 장단점

장점

  • 기존 코드 변경하지 않아도 됨
    - 클래스 재활용성 높아짐

단점

  • 구성요소 위해 클래스를 증가시켜야해서 복잡도 증가할 수 있음
  • 클래스 adapter 경우 상속 사용으로 유연하지 않음
  • 객체 adapter의 경우 대부분 코드를 다시 사용해야해서 비효율적

클래스 어댑터 vs. 객체 어댑터

  • 클래스 어댑터는 상속 사용
  • 객체 어댑터는 합성 사용

    Adapter 가 operation()을 사용할 때 specificOperation 메서드를 호출하는데, 이것이 내부 객체로 오는지 상속을 통해서 오는지의 차이가 있을뿐 동일한 형태다.

퍼사드 패턴

어떤 서브시스템의 일련의 인터페이스에 대해 통합된 인터페이스를 제공.
퍼사드에서 고수준 인터페이스를 정의하므로 서브시스템을 더 쉽게 사용할 수 있음. 즉, 단순화된 인터페이스를 통해 서브시스템을 더 쉽게 사용할 수 있도록 하기 위해 쓰는 패턴.


퍼사드 패턴 예시

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


퍼사드 패턴 장단점

장점

  • Subsystem간 결합도 낮출 수 있음
  • Client 입장에서 Subsystem을 사용해야할 때 다루어야 할 객체수를 줄여줌
    - Client입장에서 간결한 코드를 볼 수 있음

단점

  • Client에게 내부 Subsystem까지 숨길 수 없음
    - Client가 Subsystem 내부의 클래스를 직접 사용하게될 수 있음

어답터 패턴 vs. 퍼사드 패턴

  • Adapter 패턴 : 한 인터페이스를 다른 인터페이스로 변환 (for 호환성)인터페이스를 변경해서 클라이언트에서 필요로 하는 인터페이스로 적응시키기 위한 용도.

  • Facade 패턴 : 인터페이스를 간단하게 바꿈 (for 간편함)어떤 서브시스템에 대한 간단한 인터페이스를 제공하기 위한 용도.







references

0개의 댓글