트윈 패턴

Twin pattern

소프트웨어 엔지니어링에서 트윈 패턴은 개발자가 다중 상속을 지원하지 않는 프로그래밍 언어로 다중 상속을 모델링할 수 있는 소프트웨어 설계 패턴이다.이러한 패턴은 다중 상속과 관련된 많은 문제들을 피할 수 있다.[1]

정의

두 개의 슈퍼클래스에서 파생된 단일 클래스를 갖는 대신, 두 개의 슈퍼클래스 중 하나에서 각각 파생된 두 개의 개별 하위 클래스를 가진다.이 두 개의 하위 클래스는 밀접하게 결합되어 있어, 두 개의 끝을 가진 트윈 오브젝트로 볼 수 있다.[1]

적용가능성

트윈 패턴은 다음과 같이 사용할 수 있다.

  • 다중 상속이 지원되지 않는 언어로 다중 상속 모델링
  • 복수 상속의 문제를 피하기 [1]위해

구조

상속되는 데 사용되는 부모 클래스가 두 개 이상 있을 것이다.각각 슈퍼클래스 중 하나에서 파생된 하위클래스가 있을 것이다.하위 클래스는 필드를 통해 상호 연계되며, 각 하위 클래스는 슈퍼 클래스로부터 상속된 방법을 재정의할 수 있다.새로운 방법과 필드는 보통 하나의 하위 클래스로 선언된다.[1]

다음 도표는 복수 상속의 전형적인 구조를 보여준다.

Typical multiple inheritance

[1]

다음 도표는 이전의 복수 상속 구조를 대체한 후의 트윈 패턴 구조를 보여준다.

Twin pattern

[1]

공동작업

각 자식 클래스는 부모로부터 물려받은 프로토콜을 책임진다.이 프로토콜의 메시지를 처리하고 다른 메시지를 파트너 클래스로 전달한다.[1]

트윈 패턴의 고객들은 트윈 필드 중 하나를 통해 트윈 객체 중 하나를 직접 참조한다.[1]

부모 클래스의 프로토콜에 의존하는 클라이언트는 각 자식 클래스의 개체와 통신한다.[1]

샘플코드

다음 코드는 움직이는 공으로 컴퓨터 게임판을 스케치한 것이다.

게임 보드 클래스:

  공중의 계급 게임보드 연장하다 캔버스 {     공중의 인트로 너비, 높이;     공중의 게임아이템 퍼스트아이템;      } 

[1]

GameItem 클래스의 코드 스케치:

공중의 추상적 계급 게임아이템 {     게임보드 하숙하다;     인트로 포스, 포시;     게임아이템 다음에;     공중의 추상적 공허하게 하다 그림그리다();     공중의 추상적 공허하게 하다 찰칵찰칵 소리를 내다 (마우스 이벤트 e);     공중의 추상적 부울 교차하다 (게임아이템 타사의);     공중의 추상적 공허하게 하다 와 충돌하다 (게임아이템 타사의);     공중의 공허하게 하다 수표() {         게임아이템 x;         을 위해 (x = 하숙하다.퍼스트아이템; x != 무효의; x = x.다음에)             만일 (교차하다(x)) 와 충돌하다(x);     }     공중의 정태의 발리템 뉴볼(인트로 포스, 인트로 포시, 인트로 반지름) {//게임보드 방법         발리템 발리템 = 새로운 발리템(포스, 포시, 반지름);         볼트레드 볼트레드 = 새로운 볼트레드();         발리템.쌍둥이의 = 볼트레드;         볼트레드.쌍둥이의 = 발리템;         돌아오다 발리템;     } } 

[1]

BallItem 클래스의 코드 스케치:

공중의 계급 발리템 연장하다 게임아이템 {     볼트레드 쌍둥이의;     인트로 반지름; 인트로 dx, dy;     부울 가사 상태의;     공중의 공허하게 하다 그림그리다() {         하숙하다.getGraphics().드로발(포스-반지름, 포시-반지름, 2*반지름, 2*반지름); }     공중의 공허하게 하다 움직이다() { 포스 += dx; 포시 += dy; }     공중의 공허하게 하다 찰칵찰칵 소리를 내다() {         만일 (가사 상태의) 쌍둥이의.이력서();         다른 쌍둥이의.일시 정지하다();         가사 상태의 = ! 가사 상태의;     }     공중의 부울 교차하다 (게임아이템 타사의) {         만일 (타사의 의 예. )             돌아오다 포스 - 반지름 <= 타사의.포스                 && 타사의.포스 <= 포스 + 반지름                    포시 - 반지름 <= 타사의.포시                 && 타사의.포시 <= 포시 + 반지름;         다른 돌아오다 거짓의;     }     공중의 공허하게 하다 와 충돌하다 (게임아이템 타사의) {          담을 쌓다 = () 타사의;         만일 (담을 쌓다.등변성) dx = - dx; 다른 dy = - dy;     } } 

[1]

BallThread 클래스의 코드 스케치:

공중의 계급 볼트레드 연장하다 나사산 {     발리템 쌍둥이의;     공중의 공허하게 하다 달리다() {         하는 동안에 (진실의) {             쌍둥이의.그림그리다(); /*message*/ 쌍둥이의.움직이다(); 쌍둥이의.그림그리다();         }     } } 

[1]

트윈 패턴 구현

다음 문제를 고려해야 한다.

  • 데이터 추상화 - 쌍둥이 클래스의 파트너 클래스는 서로 사적인 영역과 방법에 액세스해야 하므로 긴밀하게 연결되어야 한다.자바에서는 파트너 클래스를 공통 패키지에 배치하고 필요한 필드 및 방법에 대한 패키지 가시성을 제공함으로써 이를 달성할 수 있다.Modula-3와 Oberon에서는 파트너 클래스를 공통 모듈에 배치할 수 있다.
  • 효율성 - 트윈 패턴은 메시지 전달을 필요로 하는 구성을 사용하기 때문에, 트윈 패턴은 상속보다 덜 효율적일 수 있다.그러나 어차피 복수 상속은 단일 상속보다 효율성이 약간 떨어지므로 간접비는 큰 문제가 되지 않을 것이다.[1][2]

참고 항목

참조

  1. ^ a b c d e f g h i j k l m n Mössenböck, H., Twin - A Design Pattern for Modelling Multiple Inheritance, University of Linz, Institute for System Software
  2. ^ Stroustrup, B. (May 1989), Multiple Inheritance for C++, Helsinki: Proceeding EUUG Spring Conference