어댑터, 퍼사드 패턴

강한친구·2022년 4월 12일
0

OOP Desing Pattern

목록 보기
10/15

어댑터

정의

한 클래스의 인터페이스를 다른 클래스에서 사용하고자 할 때, 어댑터를 통해서 호환성 문제를 해결한다.

Duck 과 Turkey

예전에 만든 오리 인터페이스와 객체가 있다. 그 오리 인터페이스에 칠면조를 넣으려면 어댑터라는 특수한 객체를 통해 넣어줘야한다.
코드를 살펴보자

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();
    }
}

어뎁터 실전 예제

구식 Enumeration

초기 컬렉션 형식인 Vector, Stack, Hashtable등이 그 예시이다. Enumeration안에는 hasMoreElements, nextElements같은 항목이 있다.

신형 Iterator

위의 예시와 마찬가지로 항목들 내용을 확인하는 기능을 한다.

퍼사드 패턴

데코레이터, 어댑터 퍼사드

데코레이터 = 한 인터페이스를 다른 인터페이스로 변환
어댑터 = 인터페이스는 놔두고 기능만 추가
퍼사드 = 인터페이스를 간단하게 바꿈

정의

어떤 서브시스템의 일련의 통합시스템 인터페이스를 통합하는 또 다른 인터페이스를 제공한다.

이는 최소 지식 디자인 원칙을 다른것이다. 너무 많은 권한보다는 최소한의 권한을 주는것이 좋다.

최소지식 원칙

++ 최소 지식 원칙 (데메테르의 원칙, Law of Demeter) : 정말 관련있는 객체와만 관계를 맺어라

  • 객체자체
  • 메소드에 매개변수로 전달된 객체
  • 그 메소드에서 생성하거나 인스턴스를 만든 객체
  • 그 객체에 속하는 구성요소

이 종류에 속하는 메소드만 호출해야지, 다른 것을 호출하면 안된다.

전자레인지

우리는 전자레인지의 버튼만 누르면 알아서 작동한다.
이는 퍼사드 패턴을 통해 제조사에서 각 버튼에 기능을 줬기 때문이다.

이 글 참조

0개의 댓글