본문 바로가기
Design Pattern

[Design Pattern] 프록시 패턴

by 진꿈청 2024. 3. 12.

이번 포스팅은 디자인 패턴 중 하나인 프록시 패턴에 대해 알아본다.

 

코드와 상황은 전략 패턴에서 사용했던 코드와 상황을 가져간다.

 

 

만약 문지기가 동물들을 쫓아내기 전에 무엇인가 할 행동이 추가되었다고 생각해보자.

그렇다면 코드는 다음과 같이 작성할 수 있을 것이다.

 

DoorMan

public class DoorMan {

    public void 쫓아내(Animal a){
        System.out.println("안녕 ㅎㅎ");
        System.out.println(a.getName() + " 쫓아내");
    }
}

 

 

할 행동이 잘 출력되는 것을 확인할 수 있다.

 

하지만, 이는 SOLID 원칙의 O(OCP - 개방 페쇄 원칙)에 위배된다.

당연하다. 기존에 있던 DoorMan을 수정했기 때문이다.

 

그렇기에 SOLID 원칙에 따르기 위해선 다른 방식의 코드를 사용해야 한다.

이때, 사용해볼만한 패턴이 프록시 패턴이다.

 

DoorManProxy

public class DoorManProxy extends DoorMan{
    @Override
    public void 쫓아내(Animal a) {
        System.out.println("안녕 ㅎㅎ");
        super.쫓아내(a);
    }
}

 

App

public class App {
    public static void main(String[] args) {
        Mouse m = new Mouse();
        Cat c = new Cat();
        DoorMan dm = new DoorManProxy();
        dm.쫓아내(m);
        dm.쫓아내(c);
    }
}

 

 

이런식으로 하면 OCP를 위반하지 않고 DoorMan에게 추가의 작업을 줄 수 있다.

즉, DoorMan이 실행되기 전에 특정 Proxy 작업을 처리할 수 있게 해준다.

 

그리고 위 방법에서 extends로 상속받는것이 아닌 좀 더 활용도가 높은 방법은 생성자를 사용하는 것이다.

 

DoorManProxy

 

public class DoorManProxy{
    private DoorMan doorMan;

    public DoorManProxy(DoorMan doorMan) {
        this.doorMan = doorMan;
    }

    public void 쫓아내(Animal a) {
        System.out.println("안녕 ㅎㅎ");
        doorMan.쫓아내(a);
    }
}

 

App

public class App {
    public static void main(String[] args) {
        Mouse m = new Mouse();
        Cat c = new Cat();
        DoorManProxy dm = new DoorManProxy(new DoorMan());
        dm.쫓아내(m);
        dm.쫓아내(c);
    }
}

 

이런식으로 DoorManProxy를 바라보게 한다. 이걸 프록시 패턴이라고 부른다.

'Design Pattern' 카테고리의 다른 글

[Design Pattern] 탬플릿 메서드 패턴  (0) 2024.03.28
[Design Pattern] 싱글톤 패턴  (0) 2024.03.25
[Design Pattern] 어댑터 패턴  (0) 2024.03.18
[Design Pattern] 전략 패턴  (1) 2024.03.12
SOLID란?  (3) 2024.03.11