상세 컨텐츠

본문 제목

Bridge Pattern 배워보기

Java

by techbard 2014. 1. 18. 01:28

본문

반응형

이번에는 Bridge Pattern을 배워보았다.

 

먼저 참고가 되는 소스 코드를 적어보고 이를 천천히 살펴보면서 설명해보자.

 

1. 구상 구현체를 만든다. 구상은 추상의 반대 개념으로 실제적인 일을 하는 코드를 말한다.

 

 

역시 인터페이스를 정의하고 인터페이스이므로 메소드 이름과 시그니쳐만 정의한다.

 

2. 구상 구현체를 묶어주는 역할을 하는 인터페이스를 구현하는 실제 클래스를 두 개 만든다. 이후에 기능을 더 붙이고 싶으면 단순히 이 인터페이스만 구현 (implements)하면 되겠다. (호출하는 부분의 기존 코드는 건드리지 않고!)

 

 

 

3. 이제 추상 구현체를 만든다. 추상 구현체의 의미는 실제 일을 하진 않지만 실제 일을 하는 구상 클래스들을 호출해 주는 역할이다.

 

 

추상 인터페이스를 먼저 만들었다.

 

 

다음 이와같이 추상 인터페이스를 구현하는 추상 구현 클래스를 만드는데,

 

a. 앞에서만든 구상 클래스에서 사용할 시그니쳐와 클래스 타입을 담을 멤버를 선언한다.

 

b. 생성자에서 이 시그니쳐와 클래스 타입을 받도록 정의한다. 이 얘기는 new 생성자를 통해 초기화를 해주겠다는 의미이다.

 

c. 인터페이스에서 정의한 메소드들을 구현하는데, 멤버에 저장된 시그니쳐와 객체변수를 이용해서 실제 구상 클래스를 호출하도록 해준다. (이 부분이 가장 중요!)

 

4. 이제 이 패턴을 테스트 해보자.

 

 

결과:

API1: 1, 2, 3
==========
API2: 4, 5, 6
==========

 

a. 먼저 추상 인터페이스를 담을 배열을 선언하고

b. 이 배열에 구상 클래스와 시그니쳐를 담아 추상클래스를 생성한다. (추상 클래스에 정의된 생성자를 통해 멤버를 초기화한다.)

c. 배열의 모든 인자를 하나씩 꺼내 인터페이스에 정의된 메소드를 호출한다. (실제 이 메소드는 멤버를 가지고 구상 메소드를 호출하는 역할만 한다.)

 

이제 구현부와 호출부가 분리되었다.

 

클래스 다이어그램을 보면

 

 

결국 이런 구조를 가짐으로서 복잡해지긴 했지만

 

기존 구조를 건드리지 않으면서도 구상 클래스만 나중에 추가함으로써 호출하는 부분에서만 새로 추가한 구상 클래스의 객체를 던지면 된다.

 

여기까지 보면서 가장 중요한 핵심은 RefinedAbstraction 클래스에서 멤버로 정의하고 있는 private IImplementor iImplementor; 라인의 존재이다. 이것이 구상 클래스를 컨트롤 할 수 있는 인터페이스 타입을 다룰 수 있는 핵심이된다. 또 다른 핵심은 래퍼 메소드 역할을 하는

 

public void execute() {
  iImplementor.print(x, y, z);
 }

 

메소드의 역할이다 이 메소드는 구상 클래스를 인자로 받아 그것을 구상 인터페이스 타입으로 받아 다형성으로 실제 구상 메소드를 실행한다. 

반응형

관련글 더보기

댓글 영역