Post

โ›“๏ธ Java Design-Pattern โ…ฉ - Bridge

โ›“๏ธ Java Design-Pattern โ…ฉ - Bridge

๐Ÿ“— ใ€ŽJAVA ์–ธ์–ด๋กœ ๋ฐฐ์šฐ๋Š” ๋””์ž์ธ ํŒจํ„ด : ์‰ฝ๊ฒŒ ๋ฐฐ์šฐ๋Š” GoF์˜ 23๊ฐ€์ง€ ๋””์ž์ธ ํŒจํ„ดใ€๋ฅผ ์ฝ๊ณ  ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

Bridge ํŒจํ„ด์ด๋ž€?

  • ๊ธฐ๋Šฅ์˜ ํด๋ž˜์Šค ๊ณ„์ธต๊ณผย ๊ตฌํ˜„์˜ ํด๋ž˜์Šค ๊ณ„์ธตย ์‚ฌ์ด์—์„œ ๋‹ค๋ฆฌ ์—ญํ• ์„ ํ•˜๋Š” ํŒจํ„ด

๊ธฐ๋Šฅ์˜ ํด๋ž˜์Šค ๊ณ„์ธต

  • ์–ด๋–ค ํด๋ž˜์Šคย Something์ด ์žˆ๋‹ค๊ณ  ํ•  ๋•Œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋Š” ํ•˜์œ„ ํด๋ž˜์Šคย SomethingGood๋ฅผ ๋งŒ๋“ ๋‹ค. ๋˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ํ•  ๋•Œ๋Š”ย SomethingGootย ํ•˜์œ„ ํด๋ž˜์Šค๋กœย SomethingBetterย ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.
  • ์ด๋ ‡๊ฒŒ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ํด๋ž˜์Šค ๊ณ„์ธต์—์„œ ๋ชฉ์ ๊ณผ ๊ฐ€๊นŒ์šด ํด๋ž˜์Šค๋ฅผ ์ฐพ์•„ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ๊ณ„์ธต์„ ๊ธฐ๋Šฅ์˜ ํด๋ž˜์Šค ๊ณ„์ธต์ด๋ผ๊ณ  ํ•œ๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ ํด๋ž˜์Šค ๊ณ„์ธต์„ ๋„ˆ๋ฌด ๊นŠ๊ฒŒ ํ•˜์ง€ ์•Š๋Š” ํŽธ์ด ์ข‹๋‹ค.

๊ตฌํ˜„์˜ ํด๋ž˜์Šค ๊ณ„์ธต

  • ์ƒ์œ„ ํด๋ž˜์Šค๋ฅผ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋กœ ์ธํ„ฐํŽ˜์ด์Šคย API๋ฅผ ๊ทœ์ •ํ•œ๋‹ค.
  • ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ ๋ฉ”์†Œ๋“œ๋กœ ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.
  • ์ด๋Ÿฌํ•œ ํด๋ž˜์Šค ๊ณ„์ธต์„ ๊ตฌํ˜„์˜ ํด๋ž˜์Šค ๊ณ„์ธต์ด๋ผ๊ณ  ํ•œ๋‹ค.

ํด๋ž˜์Šค ๊ณ„์ธต์˜ ํ˜ผ์žฌ์™€ ๋ถ„๋ฆฌ

  • ์ด์ฒ˜๋Ÿผ ์šฐ๋ฆฌ๊ฐ€ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•˜๋Š”์ง€, ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.
  • ๋‘ ํด๋ž˜์Šค ๊ณ„์ธต์ด ํ˜ผ์žฌ๋˜์–ด ์žˆ์œผ๋ฉด ๊ณ„์ธต์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ์˜ˆ์ธก์„ ์–ด๋ ต๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ทธ๋ž˜์„œ ๋‘ ๊ณ„์ธต์„ ๋…๋ฆฝ๋œ ํด๋ž˜์Šค ๊ณ„์ธต์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค.
  • ๋‹ค๋งŒ ๋ถ„๋ฆฌ๋งŒ ํ•˜๋ฉด ๊ทธ๋ƒฅ ํฉ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ํด๋ž˜์Šค ๊ณ„์ธต ์‚ฌ์ด์— ๋‹ค๋ฆฌ ํ•˜๋‚˜๋ฅผ ๋‘์–ด์•ผ ํ•œ๋‹ค.
  • ๊ฐ€์žฅ ์ฒ˜์Œ ์–ธ๊ธ‰ํ–ˆ๋“ฏย Bridgeย ํŒจํ„ด์€ ๋‘ ๊ณ„์ธต ์‚ฌ์ด์— ๋‹ค๋ฆฌ๋ฅผ ๋†“์•„์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ

  • ๋‹ค์Œ ํ”„๋กœ๊ทธ๋žจ์€ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค.

Displayย ํด๋ž˜์Šค

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
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();
    }
}
  • implย ํ•„๋“œ๋Š”ย Displayย ํด๋ž˜์Šค์˜ ๊ตฌํ˜„์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ•„๋“œ์ด๋‹ค.ย 
  • ์ด ํ•„๋“œ๊ฐ€ ๋‘ ํด๋ž˜์Šค ๊ณ„์ธต์˜ ๋‹ค๋ฆฌ๊ฐ€ ๋œ๋‹ค.
  • open,ย print,ย closeย ์„ธ ๋ฉ”์†Œ๋“œ๋Š”ย Displayย ํด๋ž˜์Šค์—์„œ ์ œ๊ณตํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.ย 
  • open์€ ํ‘œ์‹œ์˜ ์ „์ฒ˜๋ฆฌ์ด๋‹ค.ย 
  • print๋Š” ํ‘œ์‹œ ๊ทธ ์ž์ฒด์ด๋‹ค.ย 
  • close๋Š” ํ‘œ์‹œ์˜ ํ›„์ฒ˜๋ฆฌ์ด๋‹ค.
  • displayย ๋ฉ”์†Œ๋“œ๋Š”ย open,ย print,ย close๋ผ๋Š”ย Display์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด์šฉํ•ด โ€˜ํ‘œ์‹œํ•œ๋‹คโ€™๋Š” ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

CountDisplayย ํด๋ž˜์Šค

1
2
3
4
5
6
7
8
9
10
11
12
13
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();
    }
}
  • Displayย ๊ธฐ๋Šฅ์— ์ง€์ • ํšŸ์ˆ˜๋งŒํผ ํ‘œ์‹œํ•˜๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์—ฌย CountDisplayย ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

DisplayImplย ํด๋ž˜์Šค

1
2
3
4
5
public abstract class DisplayImpl {
	public abstract void rawOpen();
    public abstract void rawPrint();
    public abstract void rawClose();
}
  • ๊ตฌํ˜„์˜ ํด๋ž˜์Šค ๊ณ„์ธต ์ตœ์ƒ์œ„์— ์œ„์น˜ํ•˜๋Š” ์ถ”์ƒ ํด๋ž˜์Šค์ด๋‹ค.
  • ํ•˜์œ„ ํด๋ž˜์Šค๋“ค์ด ์ด ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋“ค์„ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋œ๋‹ค.

StringDisplayImplย ํด๋ž˜์Šค

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
32
public class StringDisplayImpl extends DisplayImpl {
	private String string;
    private int width;
    
    public StringDisplayImpl(String string) {
    	this.string = string;
        this.width = width;
    }
    
    @Override
    public void rawOpen() {
    	printLine();
    }
    
    @Override
    public void rawPrint() {
    	System.out.println("|" + string + "|");
    }
    
    @Override
    public void rawClose() {
    	printLine();
    }
    
    private void printLine() {
    	System.out.print("+");
        for (int i = 0; i < width; i++) {
        	System.out.print("-");
        }
        System.out.print("+");
    }
}
  • DisplayImplย ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์ด๋‹ค.

Mainย ํด๋ž˜์Šค

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Main {
	public static void main(String[] args) {
    	Display d1 = new Display(new StringDisplayImpl("Hello, Korea."));
        CountDisplay d2 = new Display(new StringDisplayImpl("Hello, World."));
        CountDisplay d3 = new CountDisplay(new StringDisplayImpl("Hello, Universe."));
        
        d1.display();
        d2.display();
        d3.display();
        
        d3.multiDisplay(5);
    }
}

Bridgeย ํŒจํ„ด์˜ ๋“ฑ์žฅ์ธ๋ฌผ

Displayย ํด๋ž˜์Šค

  • ๊ธฐ๋Šฅ์˜ ํด๋ž˜์Šค ๊ณ„์ธต์˜ ์ตœ์ƒ์œ„ ํด๋ž˜์Šค์ด๋‹ค.
  • ์ถ”์ƒํ™”ย Abstractionย ์ถ”์ƒํ™” ์—ญํ• ์„ ๋งก์•„ ๊ตฌํ˜„์ž ์—ญํ• ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ณธ ๊ธฐ๋Šฅ๋งŒ ๊ธฐ์ˆ ๋œ ํด๋ž˜์Šค์ด๋‹ค.

CountDisplayย ํด๋ž˜์Šค

  • ๊ฐœ์„ ๋œ ์ถ”์ƒํ™”ย RefinedAbstractionย ์—ญํ• ์„ ๋งก์•˜์œผ๋ฉฐ ์ถ”์ƒํ™” ์—ญํ• ์— ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

DisplayImplย ํด๋ž˜์Šค

  • ๊ตฌํ˜„์˜ ํด๋ž˜์Šค ๊ณ„์ธต์˜ ์ตœ์ƒ์œ„ ํด๋ž˜์Šค์ด๋‹ค.
  • ๊ตฌํ˜„์žย Implementorย ์—ญํ• ์„ ๋งก์•„ ์ถ”์ƒํ™” ์—ญํ• ์˜ ์ธํ„ฐํŽ˜์ด์Šคย API๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ทœ์ •ํ•œ๋‹ค.

StringDisplayImplย ํด๋ž˜์Šค

  • ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์žย ConcreteImplementorย ์—ญํ• ์„ ๋งก์•„ ๊ตฌํ˜„์ž ์—ญํ• ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.

์ฑ…์—์„œ ์ œ์‹œํ•˜๋Š” ํžŒํŠธ

๋ถ„๋ฆฌํ•ด๋‘๋ฉด ํ™•์žฅ์ด ํŽธ๋ฆฌํ•ด์ง„๋‹ค.

  • Bridgeย ํŒจํ„ด์˜ ํŠน์ง•์€ ๊ฐ ํด๋ž˜์Šค ๊ณ„์ธต์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • ๊ณ„์ธต์„ ๋ถ„๋ฆฌํ•ด ๋‘๋ฉด ์ถ”ํ›„ ๊ฐ๊ฐ์˜ ํด๋ž˜์Šค ๊ณ„์ธต์„ ๋…๋ฆฝ์ ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๊ธฐ๋Šฅ์˜ ํด๋ž˜์Šค ๊ณ„์ธต์— ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€ํ•œ ๊ธฐ๋Šฅ์€ ๋ชจ๋“  ๊ตฌํ˜„ ๊ณ„์ธต์—์„œ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

์ƒ์†์€ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ์ด๊ณ  ์œ„์ž„์€ ์•ฝํ•œ ๊ฒฐํ•ฉ์ด๋‹ค.

  • ์ƒ์†์€ ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•˜๋Š” ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ, ํด๋ž˜์Šค ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ๊ฐ•ํ•˜๊ฒŒ ๊ณ ์ •์‹œํ‚จ๋‹ค.
  • ์ด ๊ด€๊ณ„๋Š” ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š” ํ•œ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋‹ค.
  • ์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ดย Displayย ํด๋ž˜์Šค ์•ˆ์—์„œ ์œ„์ž„์„ ์‚ฌ์šฉํ•œ๋‹ค.

โ€œopen์„ ์‹คํ–‰ํ•  ๋•Œ์—๋Š” impl.rawOpen()์„ ํ˜ธ์ถœํ•œ๋‹ค.โ€
โ€œprint์„ ์‹คํ–‰ํ•  ๋•Œ์—๋Š” impl.rawPrint()์„ ํ˜ธ์ถœํ•œ๋‹ค.โ€
โ€œclose์„ ์‹คํ–‰ํ•  ๋•Œ์—๋Š” impl.rawClose()์„ ํ˜ธ์ถœํ•œ๋‹ค.โ€

  • Display์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์˜€๋”๋‹ˆย impl์—๊ฒŒ ๋ชจ๋‘ ๋– ๋„˜๊ธด๋‹ค.
  • ์ด๊ฒƒ์ด ์œ„์ž„์ด๋‹ค.
  • Mainย ํด๋ž˜์Šค์—์„œย Display์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ ์ƒ์„ฑ์ž์— ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์ž ์—ญํ• ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ธ์ˆ˜๋กœ ๋„˜๊ฒจ ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ•˜๋ฉด ๋œ๋‹ค.
  • ์ „ํ™˜ํ•  ๋•Œ ์ˆ˜์ •ํ•œ ๊ฒƒ์€ย Mainย ํด๋ž˜์Šค ๋ฟ์ด๊ณ ,ย Display๋‚˜ย DisplayImplย ๋“ฑ์€ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
This post is licensed under CC BY 4.0 by the author.