Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 알고리즘
- pointcut
- 김영한
- QueryDSL
- 백준
- transaction
- Greedy
- 그리디
- 스프링 핵심 기능
- 스프링
- kotlin
- AOP
- Spring Boot
- jpa
- JDBC
- Servlet
- springdatajpa
- SpringBoot
- 스프링 핵심 원리
- Android
- 인프런
- java
- Thymeleaf
- Exception
- db
- Proxy
- 자바
- JPQL
- http
- spring
Archives
- Today
- Total
개발자되기 프로젝트
기능의 선언과 구현을 분리 - Bridge 본문
1. Bridge Pattern
기능의 계층과 구현의 계층을 분리함
추상화와 구현을 분리하여 각갇을 독립적으로 변경할 수 있게 함.
2. 의도 (Intent)와 동기(Motivation)
- 기능의 확장과 구현의 확장을 따로 계층화 함
- 기능에 대한 여러가지 구현을 다양하게 적용할 수 있음
- 기능과 구현이 혼재하면 상속의 관계가 복잡해짐
- 두 계층을 분리하고 서로의 사이에 다리(Bridge)가 필요함
3. Class diagram
4. 객체 협력 (collaborations)
- Abstraction (List)
- 추상화 개념의 상위 클래스이고 객체 구현자(Implemntor)에 대한 참조자를 관리
- RefinedAbstraction (Stack, Queue)
- 추상화 개념의 확장된 기능을 정의
- Implementor (AbstractList)
- 구현 클래스에 대한 선언을 제공
- 하위 클래스가 구현해야 하는 기능들을 선언한다. (자바의 인터페이스)
- Implementor와 Abstraction의 메서드 이름은 서로 다를 수 있다.
- ConcreteImplementor ( Array, LinkedList )
- Implementor에 선언된 기능을 실제로 구현한다. 여러 구현방식의 클래스가 만들어 질 수 있다.
5. 중요한 결론 (consequence)
- 기능과 구현의 결합도 약하므로, 기능이 구현 방식에 얽매이지 않는다.
- 기능의 구현 클래스를 런타임때 지정할 수도 있다.
- 구현이 변경되더라도 기능 클래스 부분에 대한 컴파일은 필요없다.
- 기능과 구현은 독립적으로 확장되며, 클라이언트는 기능의 인터페이스를 사용하므로 구체적인 구현내용은 숨길 수 있다.
6. Related Pattern
- Abstract Factory : 특정 브리지를 생성하고 합성할 수 있다.
- Adapter : 서로 관련없는 클래스들이 연결 될 수 있다.
7. 예제
- List는 선형 자료구조 입니다. 그 중에는 Stack, Queue, Deque와 같이 특정 기능을 제공하는 자료구조가 있습니다.
- List를 구현하는 방법은 크게 Array와 LinkedList 가 있습니다.
- 가령 하나의 Stack을 구현한다고 할 때 Array로 구현 할 수도 있고, LinkedList로 구현할 수도 있습니다.
- Bridge Pattern을 활용하여 구현해 보세요
public interface AbstractList<T> {
void addElement(T obj);
T deleteElement(int i);
int insertElement(T obj, int i);
T getElement(int i);
int getElementSize();
}
public abstract class List<T> {
AbstractList<T> impl;
public List(AbstractList<T> list) {
this.impl = list;
}
public void add(T obj){
impl.addElement(obj);
}
public T remove(int i){
return impl.deleteElement(i);
}
public T get(int i){
return impl.getElement(i);
}
public int getSize(){
return impl.getElementSize();
}
@Override
public String toString() {
return impl.toString();
}
}
public class BridgeTest {
public static void main(String[] args) {
Stack<String> linkedListStack = new Stack<String>(new LinkedListImpl<String>());
linkedListStack.push("aaa");
linkedListStack.push("bbb");
System.out.println(linkedListStack.toString());
System.out.println(linkedListStack.pop());
System.out.println(linkedListStack.pop());
System.out.println("========================================");
Stack<String> arrayListStack = new Stack<String>(new ArrayImpl<String>());
arrayListStack.push("aaa");
arrayListStack.push("bbb");
System.out.println(arrayListStack.toString());
System.out.println(arrayListStack.pop());
System.out.println(arrayListStack.pop());
}
}
LinkedList로 구현
[bbb, aaa]
bbb
aaa
ArrayList로 구현
[bbb, aaa]
bbb
aaa
- 기능과 구현의 확장을 별도 계층으로 만들어 둠. 기능과 구현이 각각 확장됨.
8. GitHub : 211108 Bridge Pattern
'Java > 디자인 패턴' 카테고리의 다른 글
Composite Pattern (0) | 2021.11.09 |
---|---|
Decorator (0) | 2021.11.09 |
기능의 선언과 구현을 분리 - Strategy Pattern (0) | 2021.11.08 |
하위 클래스 위임 - Factory Method (0) | 2021.11.07 |
하위 클래스 위임 - Template Method (0) | 2021.11.07 |
Comments