트윈 패턴
Twin pattern소프트웨어 엔지니어링에서 트윈 패턴은 개발자가 다중 상속을 지원하지 않는 프로그래밍 언어로 다중 상속을 모델링할 수 있는 소프트웨어 설계 패턴이다.이러한 패턴은 다중 상속과 관련된 많은 문제들을 피할 수 있다.[1]
정의
두 개의 슈퍼클래스에서 파생된 단일 클래스를 갖는 대신, 두 개의 슈퍼클래스 중 하나에서 각각 파생된 두 개의 개별 하위 클래스를 가진다.이 두 개의 하위 클래스는 밀접하게 결합되어 있어, 두 개의 끝을 가진 트윈 오브젝트로 볼 수 있다.[1]
적용가능성
트윈 패턴은 다음과 같이 사용할 수 있다.
- 다중 상속이 지원되지 않는 언어로 다중 상속 모델링
- 복수 상속의 문제를 피하기 [1]위해
구조
상속되는 데 사용되는 부모 클래스가 두 개 이상 있을 것이다.각각 슈퍼클래스 중 하나에서 파생된 하위클래스가 있을 것이다.하위 클래스는 필드를 통해 상호 연계되며, 각 하위 클래스는 슈퍼 클래스로부터 상속된 방법을 재정의할 수 있다.새로운 방법과 필드는 보통 하나의 하위 클래스로 선언된다.[1]
다음 도표는 복수 상속의 전형적인 구조를 보여준다.
다음 도표는 이전의 복수 상속 구조를 대체한 후의 트윈 패턴 구조를 보여준다.
공동작업
각 자식 클래스는 부모로부터 물려받은 프로토콜을 책임진다.이 프로토콜의 메시지를 처리하고 다른 메시지를 파트너 클래스로 전달한다.[1]
트윈 패턴의 고객들은 트윈 필드 중 하나를 통해 트윈 객체 중 하나를 직접 참조한다.[1]
부모 클래스의 프로토콜에 의존하는 클라이언트는 각 자식 클래스의 개체와 통신한다.[1]
샘플코드
다음 코드는 움직이는 공으로 컴퓨터 게임판을 스케치한 것이다.
게임 보드 클래스:
공중의 계급 게임보드 연장하다 캔버스 { 공중의 인트로 너비, 높이; 공중의 게임아이템 퍼스트아이템; … }
GameItem 클래스의 코드 스케치:
공중의 추상적 계급 게임아이템 { 게임보드 하숙하다; 인트로 포스, 포시; 게임아이템 다음에; 공중의 추상적 공허하게 하다 그림그리다(); 공중의 추상적 공허하게 하다 찰칵찰칵 소리를 내다 (마우스 이벤트 e); 공중의 추상적 부울 교차하다 (게임아이템 타사의); 공중의 추상적 공허하게 하다 와 충돌하다 (게임아이템 타사의); 공중의 공허하게 하다 수표() { 게임아이템 x; 을 위해 (x = 하숙하다.퍼스트아이템; x != 무효의; x = x.다음에) 만일 (교차하다(x)) 와 충돌하다(x); } 공중의 정태의 발리템 뉴볼(인트로 포스, 인트로 포시, 인트로 반지름) {//게임보드 방법 발리템 발리템 = 새로운 발리템(포스, 포시, 반지름); 볼트레드 볼트레드 = 새로운 볼트레드(); 발리템.쌍둥이의 = 볼트레드; 볼트레드.쌍둥이의 = 발리템; 돌아오다 발리템; } }
BallItem 클래스의 코드 스케치:
공중의 계급 발리템 연장하다 게임아이템 { 볼트레드 쌍둥이의; 인트로 반지름; 인트로 dx, dy; 부울 가사 상태의; 공중의 공허하게 하다 그림그리다() { 하숙하다.getGraphics().드로발(포스-반지름, 포시-반지름, 2*반지름, 2*반지름); } 공중의 공허하게 하다 움직이다() { 포스 += dx; 포시 += dy; } 공중의 공허하게 하다 찰칵찰칵 소리를 내다() { 만일 (가사 상태의) 쌍둥이의.이력서(); 다른 쌍둥이의.일시 정지하다(); 가사 상태의 = ! 가사 상태의; } 공중의 부울 교차하다 (게임아이템 타사의) { 만일 (타사의 의 예. 벽) 돌아오다 포스 - 반지름 <= 타사의.포스 && 타사의.포스 <= 포스 + 반지름 포시 - 반지름 <= 타사의.포시 && 타사의.포시 <= 포시 + 반지름; 다른 돌아오다 거짓의; } 공중의 공허하게 하다 와 충돌하다 (게임아이템 타사의) { 벽 담을 쌓다 = (벽) 타사의; 만일 (담을 쌓다.등변성) dx = - dx; 다른 dy = - dy; } }
BallThread 클래스의 코드 스케치:
공중의 계급 볼트레드 연장하다 나사산 { 발리템 쌍둥이의; 공중의 공허하게 하다 달리다() { 하는 동안에 (진실의) { 쌍둥이의.그림그리다(); /*message*/ 쌍둥이의.움직이다(); 쌍둥이의.그림그리다(); } } }
트윈 패턴 구현
다음 문제를 고려해야 한다.
- 데이터 추상화 - 쌍둥이 클래스의 파트너 클래스는 서로 사적인 영역과 방법에 액세스해야 하므로 긴밀하게 연결되어야 한다.자바에서는 파트너 클래스를 공통 패키지에 배치하고 필요한 필드 및 방법에 대한 패키지 가시성을 제공함으로써 이를 달성할 수 있다.Modula-3와 Oberon에서는 파트너 클래스를 공통 모듈에 배치할 수 있다.
- 효율성 - 트윈 패턴은 메시지 전달을 필요로 하는 구성을 사용하기 때문에, 트윈 패턴은 상속보다 덜 효율적일 수 있다.그러나 어차피 복수 상속은 단일 상속보다 효율성이 약간 떨어지므로 간접비는 큰 문제가 되지 않을 것이다.[1][2]
참고 항목
- 어댑터 패턴, 특히 양방향 어댑터