본문 바로가기

디자인 패턴/Java언어로 배우는 디자인패턴 입문 책 정리

Facade 패턴

복잡한 로직을 숨기고 간단한 인터페이스만 제공하는 패턴


1. 코드

RouteFacade : 인터페이스를 제공하는 facade 클래스

public class RouteFacade {
	public static int getMinimumNeedTime(int startX, int startY, int endX, int endY) {
        
		// 로직1. x,y 좌표를 주소로 변환
		String start = XYConverter.toAddress(startX, startY);
		String end = XYConverter.toAddress(endX, endY);
		
		// 로직2. 여러 가지 경로를 검색
		List<Route> routeList = Route.searchByAddress(start, end);
		
		// 로직3. 최단 시간 탐색
		RouteSelector routeSelector = new RouteSelector(routeList);
		Route minimumNeedTimeRoute =  routeSelector.getShortestNeedTimeRoute();
		
		return minimumNeedTimeRoute.getNeedTime();
	}
}

 

XYConverter : 로직1(좌표를 주소로 변환)을 수행하는 클래스 

public class XYConverter {
	public static String toAddress(long x, long y) {
		return "아무 주소";
	}
}

 

Route : 로직2(여러 경로 탐색)을 수행하는 클래스

public class Route {
	
	private String route;
	private int needTime;
	
	private Route(String route, int needTime) {
		this.route = route;
		this.needTime = needTime;
	}
	
	public String getRoute() {
		return route;
	}
	
	public int getNeedTime() {
		return needTime;
	}
	
	public static List<Route> searchByAddress(String start, String end) {

		Random random = new Random();
		List<Route> routeList = new ArrayList<>();
		for (int i=0;i<10;i++) {
			String route = "route" + i;
			int needTime = random.nextInt(100);
			
			routeList.add(new Route(route, needTime));
		}
		
		return routeList;
	}
}

 

RouteSelector : 로직3(여러 경로 중 최단시간을 구하는 로직)을 수행하는 클래스

public class RouteSelector {
	private List<Route> routeList;

	public RouteSelector(List<Route> routeList) {
		this.routeList = routeList;
	}

	public Route getShortestNeedTimeRoute() {
		Route shortestRoute = routeList.get(0);
		for (int i = 1; i < routeList.size(); i++) {
			if (shortestRoute.getNeedTime() > routeList.get(i).getNeedTime()) {
				shortestRoute = routeList.get(i);
			}
		}
		
		return shortestRoute;
	}
}

 

Main: 테스트 클래스

public class Main {
	public static void main(String[] args) {
		int minimumNeedTime = RouteFacade.getMinimumNeedTime(0, 0, 100, 100);
		
		System.out.println(minimumNeedTime);
	}
}

 

 

 

2. 특징

- 로직을 호출하는 부분에서는 로직이 어떻게 돌아가는지 신경을 쓸필요가 없음

- 인터페이스와 같은 역할을 하는 패턴

 

3. 해당 패턴을 고려해볼만한 상황

- 복잡한 로직이 요구되고 로직의 변경이 예상될때

- 외부 시스템에 해당 기능을 제공할 때

'디자인 패턴 > Java언어로 배우는 디자인패턴 입문 책 정리' 카테고리의 다른 글

Observer 패턴  (0) 2021.02.21
Mediator 패턴  (0) 2021.02.14
Chain Of Responsibility 패턴  (0) 2021.02.11
Visitor 패턴  (0) 2021.02.07
Decorator 패턴  (0) 2021.01.30