특정 객체에 대한 접근을 제어하거나 기능을 추가할 수 있는 패턴
초기화 지연, 접근 제어, 로깅, 캐싱 등 다양하게 응용해 사용 할 수 있다
public interface GameService {
void startGame();
}
public class DefaultGameService implements GameService {
@Override
public void startGame() {
System.out.println("이 자리에 오신 여러분을 진심으로 환영합니다.");
}
}
기본적으로 수행해야 할 로직이 담겨있는 기본 구현체 클래스이다
public class GameServiceProxy implements GameService {
private GameService gameService;
@Override
public void startGame() {
long before = System.currentTimeMillis();
if (this.gameService == null) {
this.gameService = new DefaultGameService();
}
gameService.startGame();
System.out.println(System.currentTimeMillis() - before);
}
}
기본 구현체 클래스를 수정하지 않고 새로운 기능을 추가하기 위해 프록시 구현체를 추가해준다. 이 프록시 구현체는 기본 구현체의 인터페이스를 상속받음과 동시에 인스턴스 변수로 갖고 있어 인터페이스에 정의된 메서드대로 호출되며 프록시의 기능을 구현하고 인스턴스 변수로 들어온 기본 구현체의 기능도 호출하여 기능을 추가할 수 있다.
public class Client {
public static void main(String[] args) {
GameService gameService = new GameServiceProxy();
gameService.startGame();
}
}
- 장점
- 기존 코드를 변경하지 않고 새로운 기능을 추가할 수 있다
- 기존 코드가 해야 하는 일만 유지할 수 있다
- 기능 추가 및 초기화 지연 등으로 다양하게 활용할 수 있다
- 단점
- 코드의 복잡도가 증가한다
'java' 카테고리의 다른 글
Design Patterns - Command (0) | 2022.03.01 |
---|---|
Design Patterns - Chain of Responsibility (0) | 2022.01.30 |
Design Patterns - Flyweight (0) | 2021.12.21 |
Design Patterns - Facade (0) | 2021.12.10 |
Design Patterns - Decorator (0) | 2021.12.04 |
댓글