본문 바로가기

Software Design Pattern

자바 클래스 라이브러리에서 사용하고 있는 어댑터 디자인패턴

자바 클래스 라이브러리에서 사용하고 있는 어댑터 디자인패턴

1. Arrays.asList

2. MVC


1) 한클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환하는 설계 기법

2) 이미 존재하는 클래스를 재사용하는 기법


결합도 : 클래스간의 서로 다른 책임들이 얽혀 있는 상호 의존도 정도

강한결합 : Person class를 옮겼을 때, Camera라는 class도 같이 옮겨야 한다.

키보드 자판이 한개 고장나면 키보드 자판 한개만 교체할 수 없고 전체를 교체해야 한다.


1. 카메라 사용자와 카메라 제작사 사이의 규칙을 먼저 설계하자.

(인터페이스, 계약서, 프로토콜)


2. "모든 카메라는 위의 인터페이스로 부터 파생되어야 한다."라고 하지 말고

"모든 카메라는 위의 인터페이스를 구현해야한다."라고 표현한다.


핵심 : 교체가능하려면 인터페이스가 필요하다.

약한 결합(Loosely coupling) : 하나의 클래스가 다른 클래스를 사용할 때

부모인 인터페이스나 추상클래스를 사용해서 접근하는 것.

- 교체 가능한 유연한 디자인의 핵심

- 나중에 클래스가 추가되어도 기존 코드는 수정될 필요가 없다.

 “OCP를 만족한다."

DIP(Dependency Inversion Principle)

: 클라이언트는 구체 클래스가 아닌 추상 클래스나 인터페이스에 의존해야 한다.


1. 인터페이스를 이용하면 교체가능한 유연한 디자인을 가능하게 한다.

2. 범용 인터페이스 보다는 세분화된 인터페이스가 낫다.

ISP(인터페이스 세그리게이션)

3. 클라이언트는 구체 클래스가 아닌 인터페이스나 추상 클래스에 의존해야 한다.


List<Integer> datas = new ArrayList<>();

                      datas = new LinkedList<>();


4. 정적 팩토리 메소드를 이용하면 클라이언트가 구체적인 타입이 아닌 인터페이스를 통해객체를 사용할 수 있도록 해준다.


5. 자바8은 인터페이스 안에 정적 메소드를 두는 것을 허용한다.


6. 클라이언트가 곱셈(mul)의 연산을 요구한다면?

Java8 : default(defender) method

새로운 API의 추가로 인해 인터페이스의 변경으로 자식 클래스가 깨지는 문제를 최소화 해준다.