Visitor 파워업 구현 - cheona-thousand-man/Unity-myBasics-Wiki GitHub Wiki

방문자 패턴이란

Visitor Pattern 오브젝트에 방문한 방문자는 구조체의 특정 요소 작업 가능

  • 객체의 직접 수정 없이 방문자에게서 새로운 기능 구현
    • 객체 폐쇄된 데이터 및 구조체
  • 객체 구조 구조 탐색 + 객체 요소에 작동 + 수정없이 기능 확장
    image
    • IVisitor 방문자가 되려는 클래스가 구현할 인터페이스
    • IVisitable 방문이 가능한 클래스가 구현할 인터페이스
      • 방문자 객체가 방문하는 진입점을 제공하는 accept() 메서드 포함

1. 장·단점

  • 장점
    • 개방/폐쇄
      • 직접 수정 없이 다른 클래스의 오브젝트와 함께 작동하는 새로운 동작 추가 가능
      • 확장하기 위해 열려 있어야 하지만 수정을 위해서는 닫혀 있어야 하는 개방/폐쇄 원칙 준수
    • 단일 책임 데이터를 보유하는 객체(방문 가능)와 특정 행동을 도입하는 또 다른 객체(방문자)로 책임 분할
  • 단점
    • 접근성
      • 방문자는 방문하는 객체의 개인 필드 및 메서드에 필요한 빈도가 적을 수 있음
      • 접근자 패턴을 사용하지 않을 때보다, 더 많은 공개 속성 노출
    • 복잡성
      • 싱글턴, 상태, 오브젝트 풀 같은 패턴보다 복잡 (코드베이스 복잡화)
      • 다른 프로그래머가 혼란을 겪을 수 있음

방문자 패턴 구현 예제

1. 구현 UML

image

  • [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) 전면 실드를 수리하는 동안 주 무기의 사정거리 증가 작업
    • 시간
      • 파워업 효과는 영구 적용 (시간이 지나도 사라지지 않음)
      • 부스트된 속성의 최대치에 도달하기 전까지 이전 파워업 적용