디자인 패턴 ~Bridge~
14189 단어 객체 지향디자인 패턴신인 프로그래머 응원uml자바
1. 소개
GoF의 디자인 패턴에서 Bridge 패턴을 정리합니다.
2. Bridge 패턴이란?
기능 클래스의 계층 ... 슈퍼 클래스에서 기본적인 기능을 가지고 있고, 서브 클래스에서 새로운 기능을 추가하는 경우의 계층입니다.
구현 클래스의 계층 ... 슈퍼 클래스에서 추상 메소드에 의해 인터페이스를 규정하고 있고, 서브 클래스에서 구상 메소드에 의해 그 인터페이스를 구현하는 경우의 계층입니다.
3. 샘플 클래스 다이어그램
4. 샘플 프로그램
입력한 문자열을 지정 횟수 및 랜덤 횟수 표시하는 프로그램입니다.
4-1. Display 클래스
기능의 클래스 계층 구조입니다. 「표시」를 실시하는 클래스입니다.
이 클래스가 가지는 impl 필드가 2 개의 클래스 계층의 「다리」가 됩니다.
Display.java
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();
}
}
4-2. CountDisplay 클래스
기능의 클래스 계층 구조입니다. 「지정 횟수 표시」라고 하는 기능을 추가한 클래스입니다.
CountDisplay.java
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();
}
}
4-3. RandomCountDisplay 클래스
기능의 클래스 계층 구조입니다. 「랜덤 횟수 표시」라는 기능을 추가한 클래스입니다.
RandomCountDisplay.java
import java.util.Random;
public class RandomCountDisplay extends CountDisplay {
private Random random = new Random();
public RandomCountDisplay(DisplayImpl impl) {
super(impl);
}
public void randomDisplay(int times) {
multiDisplay(random.nextInt(times));
}
}
4-4. DisplayImpl 클래스
구현의 클래스 계층이 됩니다. 「표시」용의 메소드를 정의한 클래스입니다.
DisplayImpl.java
public abstract class DisplayImpl {
public abstract void rawOpen();
public abstract void rawPrint();
public abstract void rawClose();
}
4-5. StringDisplayImpl 클래스
구현의 클래스 계층이 됩니다. 「문자열을 사용해 표시하는」클래스입니다.
StringDisplayImpl.java
public class StringDisplayImpl extends DisplayImpl {
private String string;
private int width;
public StringDisplayImpl(String string) {
this.string = string;
this.width = string.getBytes().length;
}
public void rawOpen() {
printLine();
}
public void rawPrint() {
System.out.println("|" + string + "|");
}
public void rawClose() {
printLine();
}
private void printLine() {
System.out.print("+");
for (int i = 0; i < width; i++) {
System.out.print("-");
}
System.out.println("+");
}
}
4-6. Main 클래스
메인 처리를 실시하는 클래스입니다.
Main.java
public class Main {
public static void main(String[] args) {
Display d = new Display(new StringDisplayImpl("Display Test"));
CountDisplay cd = new CountDisplay(new StringDisplayImpl("CountDisplay Test"));
RandomCountDisplay rcd = new RandomCountDisplay(new StringDisplayImpl("RandomCountDisplay Test"));
d.display();
cd.multiDisplay(5);
rcd.randomDisplay(10);
}
}
4-7. 실행 결과
+------------+
|Display Test|
+------------+
+-----------------+
|CountDisplay Test|
|CountDisplay Test|
|CountDisplay Test|
|CountDisplay Test|
|CountDisplay Test|
+-----------------+
+-----------------------+
|RandomCountDisplay Test|
|RandomCountDisplay Test|
|RandomCountDisplay Test|
|RandomCountDisplay Test|
|RandomCountDisplay Test|
|RandomCountDisplay Test|
+-----------------------+
5. 장점
앞에서 언급했듯이 Bridge 패턴의 특징은 기능 클래스의 계층 구조와 구현 클래스의 계층 구조를 구분하는 것입니다. 이 두 클래스 계층 구조를 분리하면 각 클래스 계층 구조를 독립적으로 확장 할 수 있습니다.
기능을 추가하려면 함수의 클래스 계층 구조에 클래스를 추가합니다. 이 때, 구현 클래스 계층은 전혀 수정할 필요는 없습니다. 게다가 추가한 기능은 모든 구현에서 이용할 수 있게 됩니다.
샘플 프로그램에서는, CountDisplay 클래스나 RandomCountDisplay 클래스를 추가하는 것이, 기능 추가에 해당합니다.
이와 같이 Bridge 패턴에서는 클래스의 확장을 전망하고 잘 할 수 있습니다.
6. GitHub
7. 디자인 패턴 목록
8. 참고
이번 기사 및 샘플 프로그램은 이하의 서적을 바탕으로 작성하였습니다.
매우 이해하기 쉽고 공부가되었습니다. 감사합니다.
디자인 패턴이나 샘플 프로그램에 대한 설명이 상세하게 쓰여져 있으므로, 꼭 서적의 분도 봐 주세요.
Reference
이 문제에 관하여(디자인 패턴 ~Bridge~), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/i-tanaka730/items/91debf39a7f64ef6cb23텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)