flagtags / OOP-study

0 stars 0 forks source link

11장. 프록시 패턴 #29

Open j03y14 opened 3 months ago

kkirico commented 3 months ago

우선, 10장에서 만든 GumballMachine의 현재 상태를 출력하는 GumBallMonitor를 만들자

class GumBallMonitor {
    machine: GumballMachine;
    contructor(machine: GumballMachine){
        this.machine= machine;
    }

    report() {
        // logging
    }
}

추가 요구 사항: 뽑기 기계를 원격으로 ‘모니터링’ 하고 싶어요

→ 프록시는 진짜 객체를 대신하는 역할을 맡는다.

  1. 뽑기 기계가 네트워크로 들어오는 요청을 수용할 수 있도록 한다.
  2. GumballMonitor 에서 프록시 객체의 레퍼런스를 받아 오는 기능을 추가한다.

원격 프록시는 원격 객체의 로컬 대변자 역할을 한다.

클라이언트 객체인 GumballMonitor은 프록시를 통해서 원격 객체인 GumballMachine과 소통한다.

프록시는 원격 객체처럼 보인다.

원격 메소드의 기초

클라리언트 객체 → 클라이언트 보조 객체 | → 서비스 보조 객체 → 서비스 객체

보조 객체를 통해서 네트워크 요청을 대신한다

클라이언트 객체는 클라이언트 보조객체가 서비스객체인 것 처럼 생각한다.

RMI 짚고 넘어가기

RMI에서는 RMI 레지스트리(주소록), 정해진 인터페이스와 요청구조를 통해 서비스 객체를 찾아낸다.

프록시 패턴 정의

특정 객체로의 접근을 제어하는 대리인을 제공합니다.

원격 객체, 생성하기 힘든 객체, 보안이 중요한 객체 등 다른 객체로의 접근을 제어하는 역할을 수행할 수있다.

데코레이터랑 비슷해보인다?

proxy와 realSubject(클라이언트 객체)는 같은 subject 인터페이스를 공유합니다.

proxy는 진짜 작업을 처리하는 realSubject 객체의 레퍼런스를 가지고 있습니다.

프록시를 활용하는 다른 방법

앨범 커버 뷰어 만들기

앨범 커버를 가져오는 동안 프록시에서 화면에 메시지를 표시합니다.

앨범 커버를 가져오는 작업이 끝나면 화면에 이미지를 표시합니다.

interface Icon {
    getIconWidth: () => number;
    getIconHeight: () => number;
    paintIcon: () => void;
}

class ImageProxy implements Icon {
    imageIcon: ImageIcon;
    url: URL;
    retrievalThread: Thread;
    retrieving: boolean;

    constructor(url: URL){ imageURL = url;}

    getIconWidth() {
        if (imageIcon != null){
            return imageIcon.getIconWidth();
        }
        return 800;
    }

    getIconHeight() {
        if (imageIcon != null){
            return imageIcon.getIconWidth();
        }
        return 600;
    }

    setImageIcon(imageIcon: ImageIcon){
        this.imageIcon = imageIcon;
    }

    paintIcon() {
        // paint or show text
        // ...
    }
}

qna

데코레이터와 비슷해 보일 수 있다, 용도로서 구분한다.

접근 제어의 역할을 하는 것이 프록시이다.

행동을 추가한다면 데코레이터 이다.

객체를 프록시로 감싸는 팩토리 메소드를 사용하면, 클라이언트에서 프록시를 사용하도록 할 수 있다.