본문 바로가기

CS/디자인 패턴

Facade Pattern 퍼사드 패턴

퍼사드 패턴이란?


디자인 패턴 중 구조 패턴(Structural Patterns)에 속하는 패턴

"하위 시스템을 보다 쉽게 사용할 수 있게 해주는 고급 인터페이스"이다.

많은 분량의 코드에 접근할 수 있는 단순한 인터페이스를 제공한다.

서브시스템과의 상호작용 복잡도(결합도)를 낮추는 목적으로 사용된다.

 

출처 : https://imasoftwareengineer.tistory.com/29

 

  • Facade : 사용자의 요청을 서브시스템 객체에 전달하는 단순하고 일관된 통합 인터페이스
  • Subsystem : Facade에 대한 정보를 가지지 않고, 서브시스템의 기능을 구현하는 클래스

 

최소 지식 원칙(Principle of Least Knowledge)


객체 사이의 상호작용은 될 수 있으면 아주 가까운 '친구' 사이에서만 허용하는 것이 좋다.

  • 시스템을 디자인할 때 어떤 객체든 그 객체와 상호작용을 하는 클래스의 개수와 상호작용 방식에 주의를 기울여야 한다는 뜻

최소 지식 원칙을 잘 따르면 여러 클래스가 복잡하게 얽혀 있어서, 시스템의 한 부분을 변경했을 때 다른 부분까지 줄줄이 고쳐야 하는 상황을 미리 방지할 수 있다.

퍼사드 패턴은 이런 최소 지식 원칙을 따르고 있다.

  • 퍼사드가 클라이언트 대신 서브 시스템을 관리하고 있기 때문에 클라이언트는 퍼사드와 하나만의 관계를 가진다.

 

사용 예시


세탁기의 동작과정을 예시로 작성했다.

WashingMachine, Timer가 Subsystem의 역할이며 Facade 클래스만 접근할 수 있다.

클라이언트는 Facade 클래스에 접근하여 Subsystem을 이용할 수 있다.

 

WashingMachine Class

public class WashingMachine implements IWashingMachine {

	public WashingMachine() {
	}
	
	@Override
	public void on() {
		System.out.println("세탁기의 전원이 켜졌습니다.");
	}
	
	@Override
	public void off() {
		System.out.println("세탁기의 전원이 꺼졌습니다.");
	}
}

 

Timer Class

public class Timer implements ITimer{
	
	public Timer() {
	}

	@Override
	public void set(int time) throws InterruptedException {
		System.out.println(time + "시간(초)이 설정되었습니다. 세탁이 시작됩니다.");
		
		while(time > 0) {
			System.out.println("종료까지 " + time + "시간(초) 남았습니다.");
			Thread.sleep(1000);
			time--;
		}
		
		end();
	}

	@Override
	public void end() {
		System.out.println("세탁이 완료되었습니다.");
	}
}

 

Facade Class

public class Facade {

	private WashingMachine washingMachine;
	private Timer timer;

	public Facade() {
		washingMachine = new WashingMachine();
		timer = new Timer();
	}

	public void on(int time) {
		try {
			washingMachine.on();
			timer.set(time);
			washingMachine.off();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

 

Main Class

public class Main {

	public static void main(String[] args) {
		Facade facade = new Facade();
		facade.on(5);
	}
}

 

위와 같이 Facade Pattern을 적용하면 클라이언트는 Subsystem으로부터 분리되어 Subsystem에 의존하지 않아도 된다.

'CS > 디자인 패턴' 카테고리의 다른 글

Visitor Pattern 방문자 패턴  (3) 2022.10.13