김호쭈
DevForYou
김호쭈
전체 방문자
오늘
어제
  • 분류 전체보기 (321)
    • • 데이터베이스(DB) (9)
      • __SQL__ (9)
    • •알고리즘(Algorithm ) (117)
      • 문제풀이 (99)
      • 스터디 (14)
      • 알고리즘 팁 (4)
    • •Compter Science (57)
      • Operating System (25)
      • Computer Network (1)
      • Computer Vision (16)
      • Artificial Intelligence (14)
      • Software Technology (1)
    • • 독서 (36)
      • Design Pattern (24)
      • 객체지향의 사실과 오해 (1)
      • Object Oriented Software En.. (11)
    • • 개발 (26)
      • React (3)
      • node.js (6)
      • Django (11)
      • Spring boot (6)
    • • 개발Tip (4)
      • GitHub (0)
    • •프로젝트 (2)
      • 물물 (2)
    • •App (54)
      • 안드로이드 with Kotlin (50)
      • 코틀린(Kotiln) (4)
    • •회고 (8)
    • •취준일기 (3)
    • • 기타 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 로컬저장소
  • local저장소
  • 깃허브데스크탑
  • Remote저장소
  • ㄱ
  • GitHubDesktop
  • 원격저장소
  • KMU_WINK

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
김호쭈

DevForYou

[디자인패턴] 브릿지 패턴(Bridge Pattern)
• 독서/Design Pattern

[디자인패턴] 브릿지 패턴(Bridge Pattern)

2022. 9. 22. 11:56

# 설명

  • 기능의 확장과 구현의 확장을 따로 계층화 함
  • 기능에 대한 여러가지 구현을 다양하게 적용 가능
  • 기능과 구현을 혼재시키면 상속의 관계가 복잡해질 수 있기 떄문에 두 계층을 분리시켜 다리(Bridge)의 역할을 하게 함

기능의 확장과 구현의 확장을 따로 계층화 한다. 라는 말이 브릿지 패턴의 핵심이자 요지이다. 그러나 기능과 구현 또 이 확장이라는 것이 잘 와닿지 않을 수 있다. 이를 간단하게 설명해보자. 

## 구현 계층

 List라는 컬렉션은 LinkedList, ArrayList등 여러 형태로 구현이 가능하다. List라는 구현체에서 확장이라 함은 이러한 LinkedList,ArrayList와 같은 것이다. List를  vector로 구현의 확장이 가능할 것이다. 이렇게 리스트의 구현사항과 구현형태를 정의하도록 하는것이 Implementor계층이다. Implementor계층에서 이 List의 구현명세를 AbstrackList(Implementor)로 만들고 이 명세를 상속받아 ArrayImpl, LinkedListImpl(ConcreteImplementor)와 같이 List의 실 기능을 구현한다.

## 기능 계층

 Stack,Queue와 같은 기능은 List의 어떠한 방식(LinkedList,ArrayList,Vector...)을 사용하여 구현하여도 상관 없다. 그 기능의 역할만을 할 수 있으면 되기 때문이다. 이렇게 구현<->기능을 분리하여 기능이 구현의 방식에 얽매이지하지 않도록 한다.

 Abstraction은 Implementor(구현객체)의 참조자를 관리한다. Stack과 Queue의추상화 개념의 상위 클래스이다.

RefinedAbstraction은 추상화 개념의 확장된 기능을 정의한다 Stack과 Queue와 같이 말이다.

 

결국 기능과 구현을 분리시켜 독립적으로 변할 수 있게 하는 것이다.

 

# 코드

## 구현 계층

//AbstractList
public interface AbstractList<T> {
    public void addElement(T obj);
    public T deleteElement(int i);
    public int insertElement(T obj, int i);
    public T getElement(int i);
    public int getElementSize();
    public String toString();
}
// ArrayImpl
public class ArrayImpl<T> implements AbstractList<T>{

    ArrayList<T> array;

    public ArrayImpl(){
        array = new ArrayList<T>();
        System.out.println("ArrayList로 구현됨");
    }

    @Override
    public void addElement(T obj) {
        array.add(obj);
    }

    @Override
    public T deleteElement(int i) {
        return array.remove(i);
    }

    @Override
    public int insertElement(T obj, int i) {
        array.add(i,obj);
        return i;
    }

    @Override
    public T getElement(int i) {
        return array.get(i);
    }

    @Override
    public int getElementSize() {
        return array.size();
    }

    @Override
    public String toString() {
        return "ArrayList";
    }
}
// LinkedListImpl
public class LinkedListImpl<T> implements AbstractList<T>{

    LinkedList<T> linkedList;

    public LinkedListImpl(){
        linkedList = new LinkedList<T>();
        System.out.println("LinkedList로 구현 됨");
    }

    @Override
    public void addElement(T obj) {
        linkedList.add(obj);
    }

    @Override
    public T deleteElement(int i) {
        return linkedList.remove(i);
    }

    @Override
    public int insertElement(T obj, int i) {
        linkedList.add(i,obj);
        return i;
    }

    @Override
    public T getElement(int i) {
        return linkedList.get(i);
    }

    @Override
    public int getElementSize() {
        return linkedList.size();
    }

    @Override
    public String toString() {
        return "LinkedList";
    }
}

## 기능 계층

//List
public class List<T> {
    AbstractList<T> impl;

    public List(AbstractList<T> mImpl){
        impl = mImpl;
    }

    public void add(T obj){
        impl.addElement(obj);
    }

    public T get(int i){
        return impl.getElement(i);
    }

    public T remove(int i){
        return impl.deleteElement(i);
    }

    public int getSize(){
        return impl.getElementSize();
    }

}
//Queue
public class Queue<T> extends List<T>{
    public Queue(AbstractList<T> mImpl) {
        super(mImpl);
        System.out.println("Queue임");
    }

    public void enQueue(T obj){
        impl.addElement(obj);
    }

    public T deQueue(){
        return impl.deleteElement(0);
    }
}
//Stack
public class Stack<T> extends List<T> {
    public Stack(AbstractList<T> mImpl) {
        super(mImpl);
        System.out.println("Stack임");
    }

    public void push(T obj) {
        impl.insertElement(obj, 0);
    }

    public T pop() {
        return impl.deleteElement(0);
    }
}

#테스트

// Test
public class Test {
    public static void main(String[] args) {
        Queue<String> arrayQueue = new Queue<String>(new ArrayImpl<String>());

        arrayQueue.enQueue("aaa");
        arrayQueue.enQueue("bbb");
        arrayQueue.enQueue("ccc");

        System.out.println(arrayQueue.deQueue());
        System.out.println(arrayQueue.deQueue());
        System.out.println(arrayQueue.deQueue());
        System.out.println("=========================");

        Queue<String> linkedQueue = new Queue<String>(new LinkedListImpl<String>());
        linkedQueue.enQueue("aaa");
        linkedQueue.enQueue("bbb");
        linkedQueue.enQueue("ccc");

        System.out.println(linkedQueue.deQueue());
        System.out.println(linkedQueue.deQueue());
        System.out.println(linkedQueue.deQueue());
        System.out.println("=========================");

        Stack<String> arrayStack = new Stack<String>(new ArrayImpl<String>());
        arrayStack.push("aaa");
        arrayStack.push("bbb");
        arrayStack.push("ccc");

        System.out.println(arrayStack.pop());
        System.out.println(arrayStack.pop());
        System.out.println(arrayStack.pop());
        System.out.println("=========================");

        Stack<String> linkedStack = new Stack<String>(new LinkedListImpl<String>());
        linkedStack.push("aaa");
        linkedStack.push("bbb");
        linkedStack.push("ccc");

        System.out.println(linkedStack.pop());
        System.out.println(linkedStack.pop());
        System.out.println(linkedStack.pop());
        System.out.println("=========================");

    }

저작자표시 (새창열림)

'• 독서 > Design Pattern' 카테고리의 다른 글

[디자인 패턴] 컴포지트 패턴(Composite Pattern)  (0) 2022.09.30
[디자인패턴] 데코레이터 패턴(Decorator Pattern)  (0) 2022.09.27
[디자인패턴] 전략패턴 (Strategy Pattern)  (1) 2022.09.21
[디자인패턴-위임/팩토리패턴] 팩토리 메소드 패턴 (Factory-Method Pattern)  (2) 2022.09.20
[디자인패턴-위임패턴] 템플릿 메서드 패턴(Template Method)  (0) 2022.09.18
    '• 독서/Design Pattern' 카테고리의 다른 글
    • [디자인 패턴] 컴포지트 패턴(Composite Pattern)
    • [디자인패턴] 데코레이터 패턴(Decorator Pattern)
    • [디자인패턴] 전략패턴 (Strategy Pattern)
    • [디자인패턴-위임/팩토리패턴] 팩토리 메소드 패턴 (Factory-Method Pattern)
    김호쭈
    김호쭈
    공부하고 정리하고 기록하기

    티스토리툴바