Visitor 파워업 구현 - cheona-thousand-man/Unity-myBasics-Wiki GitHub Wiki
방문자 패턴이란
Visitor Pattern 오브젝트에 방문한 방문자는 구조체의 특정 요소 작업 가능
- 객체의 직접 수정 없이 방문자에게서 새로운 기능 구현
객체
폐쇄된 데이터 및 구조체
- 객체 구조 구조 탐색 + 객체 요소에 작동 + 수정없이 기능 확장
IVisitor
방문자가 되려는 클래스가 구현할 인터페이스IVisitable
방문이 가능한 클래스가 구현할 인터페이스- 방문자 객체가 방문하는 진입점을 제공하는
accept()
메서드 포함
- 방문자 객체가 방문하는 진입점을 제공하는
1. 장·단점
- 장점
- 개방/폐쇄
- 직접 수정 없이 다른 클래스의 오브젝트와 함께 작동하는 새로운 동작 추가 가능
- 확장하기 위해 열려 있어야 하지만 수정을 위해서는 닫혀 있어야 하는
개방/폐쇄 원칙
준수
- 단일 책임 데이터를 보유하는 객체(방문 가능)와 특정 행동을 도입하는 또 다른 객체(방문자)로 책임 분할
- 개방/폐쇄
- 단점
- 접근성
- 방문자는 방문하는 객체의 개인 필드 및 메서드에 필요한 빈도가 적을 수 있음
- 접근자 패턴을 사용하지 않을 때보다, 더 많은 공개 속성 노출
- 복잡성
- 싱글턴, 상태, 오브젝트 풀 같은 패턴보다 복잡 (코드베이스 복잡화)
- 다른 프로그래머가 혼란을 겪을 수 있음
- 접근성
방문자 패턴 구현 예제
1. 구현 UML
- [step1]
ClientVisitor 클래스
에서PowerUpAction() 메서드
내의PowerUp Engine 버튼
클릭 감지
→_bikeController.Accetp(EnginePowerUp)
실행 - [step2]
BikeController 클래스
에서 다음의 모든 클래스BikeWeapon
,BikeEngine
,BikeShield
에게ClientVisitor 클래스의 필드 EnginePowerUp(ScriptableObject)
전달
→IBikeElement.Accept(EnginePowerUp)
실행 - [step3] 다음의 모든 클래스
BikeWeapon
,BikeEngine
,BikeShield
에서ClientVisitor 클래스의 필드 EnginePowerUp (ScriptableObject)
에서 일부 속성 실행하도록 허용
→EnginePowerUp.Visit(this)
실행 - [step4]
ClientVisitor 클래스의 필드 EnginePowerUp (ScriptableObject)
에서Overloading
된 여러 메서드에서 IBikeElement에 해당하는 메서드를 실행
→Visit(BikeShield)
,Visit(BikeWeapon)
,Visit(BikeEngine)
중에서Visit(BikeWeapon)
실행
2. 구현 시 고려사항
- 파워업 메커니즘
- 세분화
- 파워업 엔티티는 여러 속성을 동시에 강화 가능
ex) 전면 실드를 수리하는 동안 주 무기의 사정거리 증가 작업
- 파워업 엔티티는 여러 속성을 동시에 강화 가능
- 시간
- 파워업 효과는 영구 적용 (시간이 지나도 사라지지 않음)
- 부스트된 속성의 최대치에 도달하기 전까지 이전 파워업 적용
- 세분화