첫번째 문제만으로 Adapter Pattern의 필요성은 충분히 알 수 있지만 좀 더 효과적으로 전달하기 위해 두번째 문제도 추가했다! 두번째 문제 같은 경우에는 팩토리 패턴을 같이 사용하면 지옥의 switch/case문을 계속 사용하는것보다 효율적으로 코드를 짤 수 있다!
Adapter Pattern이란,
한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환하는 패턴이다. 따라서, 호환되지 않는 인터페이스를 사용하는 클라이언트를 그대로 활용 가능하다.
Java를 이용해 개발할 때 입력 시 다음 코드를 많이 사용했을거다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
이 코드를 좀 더 자세히 보자.
헉 System.in이 실제로 제공하는 것과 BufferedReader가 기대하는 값이 다른데 이를 어떻게 해결할까?
-> Adapter를 둬 해결했다 !
InputStreamReader가 바로 그 어댑터 역할을 한다. 해당 클래스 코드에서 다음과 같은 주석이 달려있다. "An InputStreamReader is a bridge from byte streams to character streams." 또, 구현된 코드를 보면 Adaptee인 System.in을 wrap하고 있는걸 확인할 수 있다!
public InputStreamReader(InputStream in) {
super(in);
try {
sd = StreamDecoder.forInputStreamReader(in, this, (String)null); // ## check lock object
} catch (UnsupportedEncodingException e) {
// The default encoding should always be available
throw new Error(e);
}
}