이번 포스팅은 디자인 패턴 중 하나인 프록시 패턴에 대해 알아본다.
코드와 상황은 전략 패턴에서 사용했던 코드와 상황을 가져간다.
만약 문지기가 동물들을 쫓아내기 전에 무엇인가 할 행동이 추가되었다고 생각해보자.
그렇다면 코드는 다음과 같이 작성할 수 있을 것이다.
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 |