브리지 패턴

Bridge pattern

브릿지 패턴소프트웨어 엔지니어링에서 사용되는 설계 패턴으로, Gang of [1]Four에 의해 도입된 "추상화를 구현에서 분리하여 두 가지를 독립적으로 변경할 수 있도록 하기 위한 것"을 의미합니다.브릿지캡슐화집약을 사용하며 상속을 사용하여 책임을 다른 클래스로 나눌 수 있습니다.

클래스가 자주 바뀌면 프로그램에 대한 최소한의 사전 지식으로 프로그램 코드를 쉽게 변경할 수 있기 때문에 객체 지향 프로그래밍의 기능이 매우 유용하게 됩니다.브릿지 패턴은 클래스 및 클래스 기능이 자주 다를 때 유용합니다.클래스 자체는 추상화이며 클래스가 구현할 수 있는 것은 무엇이라고 생각할 수 있습니다.브릿지 패턴은 추상화의 두 층으로도 생각할 수 있습니다.

고정 실장이1개뿐인 경우, 이 패턴은 C++ 세계에서는 Pimpl idiod라고 불립니다.

브리지 패턴은 어댑터 패턴과 혼동되는 경우가 많고 오브젝트어댑터 패턴(예를 들어 다음 Java 코드)을 사용하여 구현되는 경우가 많습니다.

종류:추상화가 활용될 때까지 구현의 존재를 지연시킴으로써 구현의 분리를 더욱 강화할 수 있습니다.

개요

Bridge 설계 패턴은 23개의 잘 알려진 GoF 설계 패턴 중 하나로 유연하고 재사용 가능한 객체 지향 소프트웨어, 즉 구현, 변경, 테스트 및 [1]재사용이 용이한 객체를 설계하기 위해 반복되는 설계 문제를 해결하는 방법을 설명합니다.

브릿지 디자인 패턴으로 [2]해결할 수 있는 문제는 무엇입니까?

  • 추상화와 그 구현은 서로 독립적으로 정의되고 확장되어야 한다.
  • 실행 시 구현을 선택할 수 있도록 추상화와 그 구현 간의 컴파일 시간 바인딩을 피해야 합니다.

서브클래싱을 사용할 경우 서브클래스에 따라 추상 클래스가 다른 방법으로 구현됩니다.그러나 구현은 컴파일 시 추상화에 구속되며 런타임에는 변경할 수 없습니다.

Bridge 설계 패턴은 어떤 솔루션을 설명합니까?

  • 추상화를 분리하다(Abstraction(의 실장으로부터)Implementor)를 다른 클래스 계층에 배치하는 것으로 합니다.
  • 의 실장Abstraction(위임함으로써)의 관점에서Implementor물건.

이것에 의해, 에 의해서, 에 의해서, 에 의해서,Abstraction와 함께Implementor실행 시 오브젝트
다음 Unified Modeling Language 클래스 및 시퀀스 다이어그램을 참조하십시오.

구조.

UML 클래스 및 시퀀스 다이어그램

Bridge 설계 [3]패턴의 샘플 UML 클래스 및 시퀀스 다이어그램.

위의 통합 모델링 언어 클래스 다이어그램에서 추상화(Abstraction)는, 1개의 상속 계층에 통상대로 실장되어 있지 않습니다.대신 추상화에는 하나의 계층이 있습니다.Abstraction및 그 실장용 개별 계층(Implementor)를 사용하면, 2개의 디바이스가 서로 독립합니다.Abstraction인터페이스(operation()(위임함으로써)는 다음과 같은 관점에서 구현됩니다.Implementor인터페이스(imp.operationImp()).
UML 시퀀스 다이어그램은 런타임 상호 작용을 보여 줍니다.Abstraction1구현에 대한 위임의 대상Implementor1오브젝트(호출에 의한)operationImp()Implementor1조작을 실행해, 로 돌아옵니다.Abstraction1.

클래스 다이어그램

Bridge UML class diagram.svg

추상화(추상 클래스)
추상 인터페이스를 정의합니다.
는, 실장자의 레퍼런스를 보관 유지합니다.
Predified Abstraction(일반 클래스)
Abstraction에서 정의된 인터페이스를 확장합니다.
실장자(인터페이스)
에 실장 클래스의 인터페이스를 정의합니다.
Concrete Implementor(일반 클래스)
Implementor 인터페이스를 구현합니다.
LePUS3의 브리지(레전드)

C#

브리지 패턴은 트리 구조로 객체를 구성합니다.추상화를 구현에서 분리합니다.여기서 추상화는 개체를 호출할 클라이언트를 나타냅니다.C#에 실장되어 있는 예를 다음에 나타냅니다.

// 진정한 분리형 아키텍처 제공 일반의 인터페이스 Ibridge {     무효 기능 1();     무효 기능 2(); }  일반의 학급 브릿지 1 : Ibridge {     일반의 무효 기능 1()     {         콘솔.기입선(브릿지 1기능 1");     }      일반의 무효 기능 2()     {         콘솔.기입선(브릿지 1기능 2");     } }  일반의 학급 브릿지2 : Ibridge {     일반의 무효 기능 1()     {         콘솔.기입선(브릿지2.기능 1");     }      일반의 무효 기능 2()     {         콘솔.기입선(브릿지2.기능 2");     } }  일반의 인터페이스 IAbstractBridge {     무효 CallMethod 1();     무효 Call Method2(); }  일반의 학급 Abstract Bridge : IAbstractBridge {     일반의 Ibridge 다리;      일반의 Abstract Bridge(Ibridge 다리)     {         이것..다리 = 다리;     }      일반의 무효 CallMethod 1()     {         이것..다리.기능 1();     }      일반의 무효 Call Method2()     {         이것..다리.기능 2();     } } 

Bridge 클래스는 동일한 인터페이스 지향 아키텍처를 사용하여 개체를 만드는 구현입니다.반면 추상화는 구현 클래스의 인스턴스를 가져와서 해당 메서드를 실행합니다.따라서, 그들은 서로 완전히 분리되어 있다.

크리스탈

추상적인 학급 도면 API   추상적인 방어하다 draw_draw_draw_draw_drawing(x : 플로트64, y : 플로트64, 반지름 : 플로트64) 끝.  학급 Drawing API1 < > 도면 API   방어하다 draw_draw_draw_draw_drawing(x : 흘러가다, y : 흘러가다, 반지름 : 흘러가다)     "API1.circle은#{x}:#{y}- 반지름:#{반지름}"   끝. 끝.  학급 Drawing API2 < > 도면 API   방어하다 draw_draw_draw_draw_drawing(x : 플로트64, y : 플로트64, 반지름 : 플로트64)     "API2.circle:#{x}:#{y}- 반지름:#{반지름}"   끝. 끝.  추상적인 학급 모양.   보호되고 있다 취득하다 drawing_api : 도면 API    방어하다 초기화하다(@syslog_api)   끝.    추상적인 방어하다 그리다   추상적인 방어하다 resize_by_percentage(퍼센티 : 플로트64) 끝.  학급 서클 쉐이프 < > 모양.   취득하다 x : 플로트64   취득하다 y : 플로트64   취득하다 반지름 : 플로트64    방어하다 초기화하다(@x, @y, @parames(@parames), drawing_api : 도면 API)     잘 하는 군요(drawing_api)   끝.    방어하다 그리다     @syslog_api.draw_draw_draw_draw_drawing(@x, @y, @parames(@parames))   끝.    방어하다 resize_by_percentage(퍼센티 : 플로트64)     @parames(@parames) *= (1 + 퍼센티/100)   끝. 끝.  학급 브리지 패턴   방어하다 자신.시험     모양들 = []  모양.     모양들 << > 서클 쉐이프.신규(1.0, 2.0, 3.0, Drawing API1.신규)     모양들 << > 서클 쉐이프.신규(5.0, 7.0, 11.0, Drawing API2.신규)      모양들.각각 하다  모양.        모양..resize_by_percentage(2.5)       놓다 모양..그리다     끝.   끝. 끝.  브리지 패턴.시험 

산출량

API1.circle at 1.0:2.0 - radius: 3.075 API2.circle at 5.0:7.0 - radius: 11.275

C++

#실패하다 <iostream> #실패하다 <문자열> #실패하다 <blocks>   학급 도면 API {   일반의:     가상 ~도면 API() = 체납;     가상 표준::스트링 DrawCircle(원)(흘러가다 x, 흘러가다 y, 흘러가다 반지름) 컨스턴트 = 0; };  학급 Drawing API01 : 일반의 도면 API {   일반의:     표준::스트링 DrawCircle(원)(흘러가다 x, 흘러가다 y, 흘러가다 반지름) 컨스턴트 덮어쓰다 {       돌아가다 "API01.circle at " + 표준::스트링(x) + ":" + 표준::스트링(y) +         " - 반지름: " + 표준::스트링(반지름);      } };  학급 Drawing API02 : 일반의 도면 API {   일반의:     표준::스트링 DrawCircle(원)(흘러가다 x, 흘러가다 y, 흘러가다 반지름) 컨스턴트 덮어쓰다 {       돌아가다 "API02.circle at " + 표준::스트링(x) + ":" + 표준::스트링(y) +         " - 반지름: " + 표준::스트링(반지름);      } };  학급 모양. {   일반의:     모양.(컨스턴트 도면 API& drawing_api) : drawing_api_(drawing_api) {}     가상 ~모양.() = 체납;      가상 표준::스트링 그리다() 컨스턴트 = 0;     가상 흘러가다 비율별 크기 조정(컨스턴트 흘러가다 퍼센티) = 0;    보호되고 있다:     컨스턴트 도면 API& drawing_api_; };  학급 서클 쉐이프: 일반의 모양. {   일반의:         서클 쉐이프(흘러가다 x, 흘러가다 y, 흘러가다 반지름, 컨스턴트 도면 API& drawing_api)       : 모양.(drawing_api), x_(x), y_(y), 반지름_(반지름) {}      표준::스트링 그리다() 컨스턴트 덮어쓰다 {         돌아가다 drawing_api_.DrawCircle(원)(x_, y_, 반지름_);     }      흘러가다 비율별 크기 조정(컨스턴트 흘러가다 퍼센티) 덮어쓰다 {       돌아가다 반지름_ *= (1.0f + 퍼센티/100.0f);     }      사적인:     흘러가다 x_, y_, 반지름_; };  인트 주된(인트 argc, ** argv) {   컨스턴트 DrawingApi01 api1{};   컨스턴트 DrawingApi02 api2{};   표준::벡터< >서클 쉐이프> 모양들 {     서클 쉐이프{1.0f, 2.0f, 3.0f, api1},     서클 쉐이프{5.0f, 7.0f, 11.0f, api2}   };     위해서 (자동& 모양.: 모양들) {     모양..비율별 크기 조정(2.5);     표준::외치다 << > 모양..그리다() << > 표준::;   }    돌아가다 0; } 

출력:

API01.circle은 1.0000:2에 있습니다.000000 - radius : 3.075000 API02.circle (5.000000:7)000000 - 반지름: 11.275000

자바

다음 Java 프로그램은 계정 작업과 이러한 작업의 로깅을 구분하는 은행 계정을 정의합니다.

// Logger에는 info와 warning의 두 가지 구현이 있습니다. @기능인터페이스 인터페이스 로거 {     무효 로그.(스트링 메세지);          정적인 로거 정보() {         돌아가다 메세지 -> 시스템..나가..인쇄("info: " + 메세지);     }     정적인 로거 경고() {         돌아가다 메세지 -> 시스템..나가..인쇄("경고: " + 메세지);     } }  추상적인 학급 Abstract 어카운트 {     사적인 로거 로거 = 로거.정보();          일반의 무효 set Logger(로거 로거) {         이것..로거 = 로거;     }          // 로깅 부분이 Logger 구현에 위임됨     보호되고 있다 무효 작동되다(스트링 메세지, 부울 결과) {         로거.로그.(메세지 + "결과" + 결과);     } }  학급 심플 어카운트 확장 Abstract 어카운트 {     사적인 인트 균형.;          일반의 심플 어카운트(인트 균형.) {         이것..균형. = 균형.;     }          일반의 부울 is Balance Low(밸런스 로우)() {         돌아가다 균형. < > 50;     }          일반의 무효 철수하다(인트 ) {         부울 퍼포먼스 = 균형. >= ;         한다면 (퍼포먼스) {             균형. -= ;         }         작동되다("이러한" + , 퍼포먼스);     } }  일반의 학급 브리지 데모 {     일반의 정적인 무효 주된(스트링[] args) {         심플 어카운트 계좌 = 신규 심플 어카운트(100);         계좌.철수하다(75);                  한다면 (계좌.is Balance Low(밸런스 로우)()) {             // 런타임에 Logger 구현을 변경할 수도 있습니다.             계좌.set Logger(로거.경고());         }                  계좌.철수하다(10);         계좌.철수하다(100);     } } 

출력:

정보: 75 결과 철회 참 경고: 10 결과 철회 참 경고: 100 결과 철회 거짓

PHP

인터페이스 도면 API {     기능. drawCircle(원)(x달러, $y, $140); }  학급 Drawing API1 용구 도면 API {     일반의 기능. drawCircle(원)(x달러, $y, $140)     {         메아리치다 "API1.circle은x달러:$y반지름$140.\n";     } }  학급 Drawing API2 용구 도면 API {     일반의 기능. drawCircle(원)(x달러, $y, $140)     {         메아리치다 "API2.circle:x달러:$y반지름$140.\n";     } }  추상적인 학급 모양. {     보호되고 있다 $drawing API;      일반의 추상적인 기능. 그리다();     일반의 추상적인 기능. 비율별 크기 조정($pct);      보호되고 있다 기능. __개요(도면 API $drawing API)     {         $ this->도면 API = $drawing API;     } }  학급 서클 쉐이프 확장 모양. {     사적인 x달러;     사적인 $y;     사적인 $140;      일반의 기능. __개요(x달러, $y, $140, 도면 API $drawing API)     {         부모::__개요($drawing API);         $ this->x = x달러;         $ this->y = $y;         $ this->반지름 = $140;     }      일반의 기능. 그리다()     {         $ this->도면 API->drawCircle(원)($ this->x, $ this->y, $ this->반지름);     }      일반의 기능. 비율별 크기 조정($pct)     {         $ this->반지름 *= $pct;     } }  학급 테스터 {     일반의 정적인 기능. 주된()     {         $140 = 배열(             신규 서클 쉐이프(1, 3, 7,  신규 Drawing API1()),             신규 서클 쉐이프(5, 7, 11, 신규 Drawing API2()),         );          앞지르다 ($140 ~하듯이 $shape($shape)) {             $shape($shape)->비율별 크기 조정(2.5);             $shape($shape)->그리다();         }     } }  테스터::주된(); 

출력:

API1.circle(1:3 반지름 17.5 API2.circle 5:7 반지름 27.5)

스칼라

특성 도면 API {   방어하다 drawCircle(원)(x: 이중, y: 이중, 반지름: 이중) }  학급 Drawing API1 확장 도면 API {   방어하다 drawCircle(원)(x: 이중, y: 이중, 반지름: 이중) = 인쇄(s"API #1$x $y $반지름") }  학급 Drawing API2 확장 도면 API {   방어하다 drawCircle(원)(x: 이중, y: 이중, 반지름: 이중) = 인쇄(s"API #2$x $y $반지름") }  추상적인 학급 모양.(도면 API: 도면 API) {   방어하다 그리다()   방어하다 크기 조정 비율(PCT: 이중) }  학급 서클 쉐이프(x: 이중, y: 이중, 변화하다 반지름: 이중, 도면 API: 도면 API)     확장 모양.(도면 API: 도면 API) {    방어하다 그리다() = 도면 API.drawCircle(원)(x, y, 반지름)    방어하다 크기 조정 비율(PCT: 이중) { 반지름 *= PCT } }  물건 브리지 패턴 {   방어하다 주된(args: 어레이[스트링]) {      (  신규 서클 쉐이프(1, 3, 5, 신규 Drawing API1),  신규 서클 쉐이프(4, 5, 6, 신규 Drawing API2)     ) 앞지르다 { x =>         x.크기 조정 비율(3)         x.그리다()          }    } } 

파이썬

""" 브리지 패턴의 예시. """ 부터 abc 수입품 ABC메타, 추상적 방법   미실장 = "이것을 구현해야 합니다."   학급 도면 API:     __메타클래스__ = ABC메타      @http 방법     방어하다 draw_draw_draw_draw_drawing(자신, x, y, 반지름):         올리다 구현되지 않은 오류(미실장)   학급 Drawing API1(도면 API):     방어하다 draw_draw_draw_draw_drawing(자신, x, y, 반지름):         돌아가다 f"API1.circle은{x}:{y}- 반지름:{반지름}"   학급 Drawing API2(도면 API):     방어하다 draw_draw_draw_draw_drawing(자신, x, y, 반지름):         돌아가다 f"API2.circle:{x}:{y}- 반지름:{반지름}"   학급 Drawing API3(도면 API):     방어하다 draw_draw_draw_draw_drawing(자신, x, y, 반지름):         돌아가다 f"API3.circle:{x}:{y}- 반지름:{반지름}"   학급 모양.:     __메타클래스__ = ABC메타      drawing_api = 없음.     방어하다 __init__(자신, drawing_api):         자신.drawing_api = drawing_api      @http 방법     방어하다 그리다(자신):         올리다 구현되지 않은 오류(미실장)      @http 방법     방어하다 resize_by_percentage(자신, 퍼센티):         올리다 구현되지 않은 오류(미실장)   학급 서클 쉐이프(모양.):     방어하다 __init__(자신, x, y, 반지름, drawing_api):         자신.x = x         자신.y = y         자신.반지름 = 반지름         잘 하는 군요(서클 쉐이프, 자신).__init__(drawing_api)       방어하다 그리다(자신):         돌아가다 자신.drawing_api.draw_draw_draw_draw_drawing(자신.x, 자신.y, 자신.반지름)      방어하다 resize_by_percentage(자신, 퍼센티):         자신.반지름 *= 1 + 퍼센티 / 100   학급 브리지 패턴:     @static 방식     방어하다 시험():         모양들 = [             서클 쉐이프(1.0, 2.0, 3.0, Drawing API1()),             서클 쉐이프(5.0, 7.0, 11.0, Drawing API2()),             서클 쉐이프(5.0, 4.0, 12.0, Drawing API3()),         ]          위해서 모양.  모양들:             모양..resize_by_percentage(2.5)             인쇄물(모양..그리다())   브리지 패턴.시험() 

「 」를 참조해 주세요.

레퍼런스

  1. ^ a b Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John (1994). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley. p. 151. ISBN 0-201-63361-2.
  2. ^ "The Bridge design pattern - Problem, Solution, and Applicability". w3sDesign.com. Retrieved 2017-08-12.
  3. ^ "The Bridge design pattern - Structure and Collaboration". w3sDesign.com. Retrieved 2017-08-12.

외부 링크