2015년 10월 18일 일요일

클래스 디자인 패턴 16. Bridge Pattern

1. 개념
  1) 의미
     일정 기능을 담당하는 구조체에 특정 기능을 추가하는
        하나의 방법입니다.
     이를 좀더 확장하기 용이하게 하기 위해서 구현부분과
       추상부분을 분리합니다.  이후 이 두부분을
       이용해서 독립적으로 발전시킬 수 있습니다.


2. 소스

  1) 무언가 작업을 하는데 adapter 의 방법을 좀 인용한것
       같습니다. display 와 이를 상속하여 추가 구현할
       클래스 CountDisplay 을 작성합니다.
      display에서 에러나는 부분은 차후 작업합니다.
      display와 countdisplay는 기존 작업 내용을 포함하여
       새로운 기능을 추가합니다.

public class Display {
private DisplayImpl impl;
public Display(DisplayImpl impl){
this.impl = impl;
}
public void open(){
impl.rawOpen();
}

public void print(){
impl.rawPrint();
}

public void close(){
impl.rawClose();
}

public final void display(){
open();
print();
close();
}
}


public class CountDisplay extends Display {

public CountDisplay(DisplayImpl impl) {
super(impl);
}
public void multiDisplay(int times){
open();
for(int i=0; i<times;i++){
print();
}
close();
}
}


  2) displayimpl 을 작업하는 이 클래스는 추상클래스 입니다.
      기존 구현부를 담당하며 메소드를 규정합니다.

public class CountDisplay extends Display {

public CountDisplay(DisplayImpl impl) {
super(impl);
}

public void multiDisplay(int times){
open();
for(int i=0; i<times;i++){
print();
}
close();
}
}


  3) impl을 상속받아 실제 구현부를 작성합니다.

public class StringDisplayImpl extends DisplayImpl {
private String string;
private int width;
public StringDisplayImpl(String string){
this.string = string;
this.width = string.getBytes().length;
}
@Override
public void rawClose() {
printLine();
}

private void printLine() {
System.out.print("+");
for(int i=0; i<width; i++){
System.out.print("-");
}
System.out.println("+");
}
@Override
public void rawPrint() {
System.out.println("|"+string+"|");
}

@Override
public void rawOpen() {
printLine();
}
}


  4) 이를 테스트할 코드를 작성합니다.
      그냥 작성한 인스턴스를 불러서 생성할 수 있지만
      왜 이렇게 돌려서 작성하냐면 상속을 피하고
      인터페이스를 활용한 느슨한 연결을
      하고 싶어서 입니다.

public class MainTest {
public static void main(String[] args) {
Display d1 = new Display(new StringDisplayImpl("Hello, Korea"));
Display d2 = new CountDisplay(new StringDisplayImpl("Hello, World"));
CountDisplay d3 = new CountDisplay(new StringDisplayImpl("Hello, Universe"));

d1.display();
d2.display();
d3.display();
d3.multiDisplay(5);
}
}


결과 :
+------------+
|Hello, Korea|
+------------+
+------------+
|Hello, World|
+------------+
+---------------+
|Hello, Universe|
+---------------+
+---------------+
|Hello, Universe|
|Hello, Universe|
|Hello, Universe|
|Hello, Universe|
|Hello, Universe|
+---------------+


3. 다이어그램
https://ko.wikipedia.org/wiki/%EB%B8%8C%EB%A6%AC%EC%A7%80_%ED%8C%A8%ED%84%B4

4. 관련패턴
  1) Template Method 패턴

  2) Abstract Factory

  3) Adapter 패턴

댓글 없음:

댓글 쓰기