원하는 기능을 구현하려 할 때
구현되어있는 기존클래스를 인스턴스로 가져와서
클라이언트가 요구하는 기능으로 변환시킨다.
기존에 만들어져 있던 칠면조 인터페이스와 구현된 와일드칠면조 클래스
타겟인 오리 인터페이스와 객체
Duck 객체가 모자라서 Turkey 객체를 대신 사용해야 하는 상황일 때
타겟 인터페이스인 오리 인터페이스를 구현한 칠면조Adapter클래스 칠면조 인스턴스를 받아서 객체를 생성.
콘솔에 동작내역을 확인하면, 칠면조처럼 골록 골록하고 있다.
오리의 메소드를 사용해서 칠면조처럼 변환되었음을 알 수 있다.
- 클라이언트에서 타겟 인터페이스를 사용하여 메소드를 호출함으로써 어댑터에 요청을 한다.
- 어댑터에서는 어댑티 인터페이스를 사용하여 그 요청을 어댑티 에 대한 하나 이상의 메소드를 호출로 변환한다.
- 클라이언트에서는 호출 결과를 받긴 하지만 중간에 어댑터가 껴 있는지는 전혀 알지 못한다.
클래스 어댑터 vs 객체 어댑터
차이점.
클래스 💨 어댑터는 상속을 사용함.
객체 💨 어댑터는 합성을 사용함.
위 그림을 보면,
adapter가 메소드를 사용할 때 specificOperation 메소드를 호출하는데,
내부 객체로 오는지 상속을 통해오는지의 방법의 차이일뿐 동일한 형태이다.
장점
Adapter 패턴의 가장 큰 장점은 기존 코드를 변경하지 않아도 된다는 점이다.
기존 코드를 변경하지 않기 때문에 클래스 재활용성을 증가시킬 수 있다.
단점
구성요소를 위해 클래스를 증가시켜야 하기 때문에 복잡도가 증가할 수 있습니다.
클래스 Adapter 의 경우 상속을 사용하기 때문에 유연하지 못합니다.
반면에 객체 Adapter 의 경우는 대부분의 코드를 다시 작성해야 하기 때문에
효율적이지 못합니다.
==========================================================================================================================
어떤 서브시스템의 일련의 인터페이스에 대한 통합된 인터페이스를 제공한다.
퍼사드에서 고수준 인터페이스를 정의하기 때문에 서브시스템을 더 쉽게 사용할 수 있다.
퍼사드(Facade) 라는 것은 무엇일까?
퍼사드란, 프랑스어 Façade 에서 유래된 단어로 건물의 외관이라는 뜻을 가지고 있다. 건물의 외벽에서 보면 안의 구조는 보이지 않는다.
예시 - 영화를 볼 때
영화 볼 때 마실 음료수
넷플릭스를 켤 리모콘
영화를 찾기까지의 과정들
영화와 음료이름을 매개변수로 받는 facade 클래스
view_movie 메소드 동작시 해당하는 알고리즘이 모두 실행된다.
facade 객체를 생성해서 view_movie 메소드를 실행하였다.
해당하는 내역들이 콘솔에 찍혔다.
장점
Subsystem 간의 결합도를 낮출 수 있다.
Client 입장에서 Subsystem을 사용해야 할때 다루어야 할 객체의 수를 줄여준다.
클라이언트 입장에서 좀 더 간결하게 코드를 알아볼 수 있게 해준다.
단점
Client에게 내부 Subsystem까지 숨길 수 없다.
Client가 Subsystem 내부의 클래스를 직접 사용하는 것을 막을 수 없다.