Ch7. 어댑터 패턴과 퍼사드 패턴 : 적응시키기

객체지향 어댑터

어떤 인터페이스를 클라이언트에서 요구하는 형태로 적응시키는 역할을 한다.

Untitled

어댑터는 클라이언트로부터 요청을 받아서 새로운 업체에서 제공하는 클래스를 클라이언트가 받아들일 수 있는 형태의 요청으로 변환해 주는 중개인 역할을 한다.

클라이언트에서 어댑터를 사용하는 방법

  1. 클라이언트에서 타깃 인터페이스로 메소드를 호출해서 어댑터에 요청을 보낸다.

  2. 어댑터는 어댑티 인터페이스로 그 요청을 어댑티에 관한 (하나 이상의) 메소드 호출로 변환한다.

  3. 클라이언트는 호출 결과를 받긴 하지만 중간에 어댑터가 있다는 사실을 모른다.

어댑터 패턴

<aside> 💡 **어댑터 패턴(Adapter Pattern)**은 특정 클래스 인터페이스를 클라이언트에서 요구하는 다른 인터페이스로 변환한다. 인터페이스가 호환되지 않아 같이 쓸 수 없었던 클래스를 사용할 수 있게 도와준다.

</aside>

  • 어댑터 패턴은 여러 객체지향 원칙을 반영한다.

  • 어댑티를 새로 바뀐 인터페이스로 감쌀 때는 객체 구성 (composition)을 사용한다.

    • 이런 접근법은 어댑티의 모든 서브클래스에 어댑터를 쓸 수 있다는 장점이 있다.

  • 클라이언트를 특정 구현이 아닌 인터페이스에 연결한다. 이렇게 인터페이스를 기준으로 코딩했기에 타깃 인터페이스만 제대로 유지한다면 나중에 다른 구현을 추가하는 것도 가능하다.

Enumeratioin을 Iterator에 적응시키기

public class EnumerationIterator implements Iterator<Object> {
	Enumeration<?> enumeration;
	
	public EnumerationIterator(Enumeration<?> enumeration) {
		this.enumeration = enumeration;
	}

	public boolean hasNext() {
		return enumeartion.hasMoreElements();
	}

	public Object next() {
		return enumeration.nextElement();
	}

	public void remove() {
		throw new UnsupportedOperationException();
	}
}

퍼사드 패턴

  • 서브 시스템의 기능을 사용할 수 있는 간단하 인터페이스를 제공

  • 클라이언트에서 특정 인터페이스가 필요하다면 서브시스템 클래스를 그냥 사용하면됨

  • 퍼사드를 사용하면 클라이언트 구현과 서브시스템을 분리할 수 있다.

⇒ 퍼사드는 인터페이스를 아주 단순하게 만들고 클라이언트와 구성요소로 이루어진 서브시스템을 분리하는 역할도 한다.

퍼사드와 어댑터는 모두 여러 개의 클래스를 감쌀 수 있다. 하지만 퍼사드는 인터페이스를 단순하게 만드는 용도로 쓰이는 반면, 어댑터는 인터페이스를 다른 인터페이스로 변환하는 용도로 쓰인다.

💡 퍼사드 패턴(Facade Pattern)은 서브시스템에 있는 일련의 인터페이스를 통합 인터페이스로 묶어준다. 또한 고수준 인터페이스도 정의하므로 서브시스템을 더 편리하게 사용할 수 있다.

최소 지식 원칙 (Principle of Least Knowledge)

객체사이의 상호작용은 될 수 있으면 아주 가까운 ‘친구’ 사이에서만 허용하는 편이 좋다.

Last updated