Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
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
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

기능의 선언과 구현을 분리 - Bridge 본문

Java/디자인 패턴

기능의 선언과 구현을 분리 - Bridge

Seung__ 2021. 11. 8. 23:26

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


 

GitHub - bsh6463/designPattern

Contribute to bsh6463/designPattern development by creating an account on GitHub.

github.com

 

'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