프로그램의 내부 분류를 기능부분과 구현부분으로 나눠서 만든 형태를 브릿지 패턴이라고 한다.
이 두 종류의 클래스 계층이 혼합된다면 client코드가 플랫폼 의족적인 형태가 될 수 있다.
프로그램의 기능과 구현을 분리하여 둘의 구조가 독립적으로 변화될 수 있도록 한 패턴
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 abstract class DisplayImpl {
public abstract void rawOpen();
public abstract void rawPrint();
public abstract void rawClose();
}
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();
}
}
public class StringDisplayImpl extends DisplayImpl {
private String string;
private int width;
public StringDisplayImpl(String string) {
this.string = string;
this.width = string.length();
}
@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.println("+");
}
}
public class Main {
public static void main(String[] args) {
CountDisplay d = new CountDisplay(new StringDisplayImpl("Hello, Korea."));
d.multiDisplay(10);
}
}
class Display{
private var impl: DisplayImpl
init(_ impl: DisplayImpl){
self.impl = impl
}
func open(){
impl.rawOpen()
}
func print(){
impl.rawPrint()
}
func close(){
impl.rawClose()
}
final func display(){
open()
print()
close()
}
}
protocol DisplayImpl{
func rawOpen()
func rawPrint()
func rawClose()
}
class CountDisplay: Display {
override init(_ impl: DisplayImpl) {
super.init(impl)
}
func multiDisplay(_ times: Int){
open()
for i in 0...times {
print()
}
close()
}
}
class StringDisplayImpl: DisplayImpl{
private var string: String
private var width: Int
init(_ string: String) {
self.string = string
self.width = string.count
}
func rawOpen() {
printLine()
}
func rawPrint() {
print("| \(string) |")
}
func rawClose() {
printLine()
}
func printLine() {
print("+ \(String(repeating: "-", count: width)) +")
}
}
@main
struct Main {
static func main() {
var d: CountDisplay = CountDisplay(StringDisplayImpl("Hello Korea"))
d.multiDisplay(11)
}
}
브릿지 패턴은 프로그램의 구조를 기능부분과 구현부분으로 나눠서 그사이에 브릿지(다리)를 두고 이용하는 형태의 패턴이다.
브릿지 패턴을 이용하면 기능추가를 하기 위해서 기능계층에 코드 추가만 이루어 지면 되기 때문에 유지보수, 기능추가 부분에서 이점을 갖는 패턴이다.