디자인 패턴/게임 프로그래밍 패턴

[게임 프로그래밍 패턴][16]서비스 중개자

우향우@ 2024. 5. 5. 16:01

개요

서비스 중개자는 서비스 제공자 인터페이스를 상속한 구체 서비스 제공자를 인터페이스로 보관하는 서비스 중개자를 하나 두고 중개자를 통해 서비스를 제공하는 패턴이다. 싱글턴 패턴과 유사한데 클래스에서 자기 자신의 인스턴스를 관리하는 것이 아닌 중개자라는 다른 클래스에서 해당 서비스 제공자의 인터페이스 포인터에 서비스 제공자를 저장해둔다는 점이 다르다.

 

특징

싱글톤과 비교되는 서비스 중개자의 특징은 서비스 제공자 객체가 바뀔수 있다는 점이다. 싱글턴은 보통 초기화 이후 이를 계속 유지하지만 서비스 중개자는 컴파일, 런타임 시점등에서 갈아 끼울 수 있다. 이를 이용하여 곳곳에서 사용하는 서비스를 한번에 수정할 수 있다. 예를 들면 오디오 서비스에서 실제 오디오 출력 서비스를 로그 출력으로 수정하는 식으로 바꿀 수 있다. 하지만 넓은 범위에서 사용하는 기능이기에 런타임에 수시로 변경되는 기능보다는 현재 실행 타입(디버그 실행, 릴리스 실행)등에 따라 몇몇 서비스의 기능을 수정하는 수준으로 주로 사용된다.

 

null 처리

서비스 중개자가 관리하는 서비스 제공자가 null일 수도 있기에 이에 대한 처리가 필요하다.

null 리턴

사용자에게 처리를 넘기는 방식이다. 유연하나 코드 중복이 발생할 수 있고 사용자의 책임이 커진다.

null 서비스 객체 리턴

null의 경우에 각 인터페이스 별로 적절한 처리를 하는 클래스를 하나 정의해두고 해당 인스턴스를 리턴한다. null인 경우에 사용자가 특별한 처리를 하지않아도 지정된 처리를 하며 크래쉬가 나지 않는다. 하지만 예상치못하게 동작할 수 있고 그런 경우 디버깅이 힘들다.

assert

완전 버그로 판단하고 assert로 처리하는 방식이다. 실행이 종료되지만 버그 발생 시점을 정확히 알 수 있다.

 

서비스 등록 방식

서비스 중개자가 가진 서비스는 다음과 같이 등록할 수 있다.

외부 코드에서 등록

간단하며 서비스 제공자에 대한 복잡한 처리들을 서비스 제공자에서 알 필요없다. 또한 런타임에서 서비스를 교체할 수 있다. 하지만 서비스 중개자가 외부 코드에 대한 의존을 가지게 된다.

컴파일 시점 바인딩

define if 전처리로 현재 컴파일에 따라 적절한 클래스로 서비스 제공자를 등록하는 방식이다.

런타임에서 파일 설정 값 읽기

런타임 초기화 시 특정 텍스트 파일을 읽고 리플렉션 등으로 해당 텍스트에 따라 적절한 타입의 서비스를 생성하여 등록한다.

 

서비스 제공 범위

서비스 중개자는 public static 메소드로 전역적으로 서비스를 제공 할 수도 있지만 protected 메소드로 일부 특정 클래스를 상속 받은 클래스에서만 사용하도록 제한 할 수도 있다.

 

데커레이터 패턴

한국 말론 장식자 패턴이다. 특정 인터페이스 계층에 대한 wrap클래스를 만드는 기법이다. 해당 인티페이스를 상속받으며 멤버로 해당 인터페이스 포인터를 하나가진다. 각 인터페이스 메서드에 자신의 추가적인 처리와 멤버 포인터의 해당 메소드 호출을 넣어 구현한다. 이를 통해 해당 클래스에 해당 인터페이스를 상속받은 인스턴스의 포인터를 넣으며 해당 클래스를 생성하고 그 인스턴스로 메소드를 호출하면 추가 기능과 함께 포함된 인스턴스의 기능도 호출된다. 대표적으로 특정 기능마다 로그를 추가하는 방식등이 있다.

 

 

 

 

참고서적

게임 프로그래밍 패턴