Proxy

DongHeon·2022년 12월 13일
0

디자인 패턴

목록 보기
11/12

오늘은 Proxy 패턴에 대해 알아보겠습니다.

Proxy 패턴을 공부하면서 Delegate 패턴과 비슷하다고 느꼈습니다. 실제로 RxSwift에는 DelegateProxy가 존재합니다.

RxSwiftDelegateProxyDelegate를 사용하는 프레임워크와 RxSwift의 다리 역할을 한다고 합니다.

참고 블로그

Delegate 패턴은 객체의 책임을 다른 객체로 전달합니다.

Proxy?

특정한 객체에 접근하기 전에 Proxy 객체를 통해 접근하는 패턴입니다.

Proxy 객체를 통해 접근하는 이유?

  • 특정 객체에 대한 접근을 제어하거나 기능을 추가할 수 있기 때문입니다. 즉 기존 코드를 변경하지 않고도 기능을 추가할 수 있습니다.

사용하는 로직에 대해서는 RealSubjectProxy에 구현해야 합니다.

코드

패턴 적용 전

class GameService {
    func startGame() {
        print("게임을 시작합니다")
    }
}

class Client {

    private let gameService: GameService

    init(gameService: GameService) {
        self.gameService = gameService
    }

    func insertCoin() {
        gameService.startGame()
    }
}

Client가 동전을 넣으면 게임이 시작되는 코드입니다.

만약 3초 뒤에 시작 문구가 나타나도록 하려면 GameService에 있는 startGame 메서드를 수정해야 합니다.

하지만 GameService를 수정할 수 없다면 기능을 추가할 수 없고 수정이 가능하더라도 OCP를 위반하게 됩니다.

패턴 적용

  • Subject
protocol GameService {
    func startGame()
}
  • RealSubject
class DefaultGameService: GameService {
    func startGame() {
        print("게임을 시작합니다.")
    }
}
  • Proxy
class ProxyGameService: GameService {
    private let gameService: GameService
    
    init(gameSerivce: GameService) {
        self.gameSerivce = gameSerivce
    }
    
    func startGame() {
        sleep(3)
        gameSerivce.startGame()
    }
}

Proxy객체에서 3초를 기다리는 코드를 추가했습니다.

  • Client
class Client {
    func insertGame() {
        let gameService = ProxyGameService(gameSerivce: DefaultGameService())
        gameService.startGame()
    }
}

Client는 직접 DefaultGameService를 사용하지 않고 ProxyGameService를 통해 기능을 수행하고 있다.

주의 : 만약 RealSubject를 생성하는 과정에서 많은 자원이 필요하다면 지연 저장 속성을 이용해 초기화를 진행합니다.

장단점

  • 장점
    1. 기존 코드를 변경하지 않고 새로운 기능을 추가할 수 있다.
    2. 기존 코드가 해야 하는 일만 유지할 수 있다.
    3. 기능 추가 및 초기화 지연 등으로 다양하게 활용할 수 있다.

  • 단점
    1. 코드의 복잡도가 증가한다.

해당 글은 인프런의 코딩으로 학습하는 GoF 디자인 패턴 강의를 참고해 작성했습니다.

⭐️ 부족하거나 잘못된 부분이 있다면 댓글은 언제나 환영입니다!! ⭐️

0개의 댓글