Facade 패턴은 복잡한 서브 시스템에 통일된 인터페이스를 제공함으로써 복잡한 API를 단순화 시켜준다. 시스템을 서브 시스템 단위로 나누어 구성하는 것은 시스템의 복잡도를 낮춰주지만, 동시에 서브 시스템 사이에서의 통신 부하와 결합도가 증가하게 된다. 이러한 서브 시스템 사이의 의존도를 낮추고, 서브 시스템의 사용자 입장에서 사용하기 편리한 인터페이스를 제공하고자 하는 것이 facade 객체이다.
2. 적용 영역
■ 복잡한 서브 시스템에 대해 간단한 인터페이스를 제공하기를 원하는 경우
■ 클라이언트와 인터페이스의 구현 클래스 사이에 의존도가 높은 경우
■ 서브 시스템을 레이어(layer)로 구분하고자 하는 경우
3. 참가자들(participants)
The classes and/or objects participating in this pattern are:
- Facade (MortgageApplication)
- knows which subsystem classes are responsible for a request.
- delegates client requests to appropriate subsystem objects.
- Subsystem classes (Bank, Credit, Loan)
- implement subsystem functionality.
- handle work assigned by the Facade object.
- have no knowledge of the facade and keep no reference to it.
5. 적용 결과
■ 서브 시스템의 컴포넌트로부터 클라이언트를 격리하여, 클라이언트가 쉽게 서브 시스템을 이용할 수 있다.
■ 서브 시스템과 클라이언트 사이의 의존성을 낮춘다.
■ Facade 패턴을 사용한다고 해도, 필요한 경우 서브 시스템의 클래스에 직접 접근할 수도 있다. 즉, 일반화 정도(generality)와 개발의 편의성 사이에서의 적당한 합의점을 찾아야 한다.
6. 예제
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
class FacadeTest extends JFrame
{
private JFrame frame;
private JPanel panel;
private JTextArea MainWindow;
private JScrollPane sp1;
private JTextField ChatWindow;
private JButton SendButton;
private JTextArea UserWindow;
private JScrollPane sp2;
public FacadeTest()
{
}
public void createUI()
{
setTitle("Facade Test");
setBounds(0, 0, 467, 260);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel = new JPanel();
panel.setLayout(null);
add(panel, BorderLayout.CENTER);
MainWindow = new JTextArea();
sp1 = new JScrollPane(MainWindow);
MainWindow.setLineWrap(true);
MainWindow.setEditable(false);
sp1.setBounds(5, 5, 300, 198);
panel.add(sp1);
ChatWindow = new JTextField();
ChatWindow.setBounds(5, 205, 230, 25);
panel.add(ChatWindow);
SendButton = new JButton("Send");
SendButton.setBounds(238, 206, 64, 23);
panel.add(SendButton);
UserWindow = new JTextArea();
sp2 = new JScrollPane(UserWindow);
UserWindow.setEditable(false);
sp2.setBounds(310, 5, 145, 225);
panel.add(sp2);
setResizable(false);
show();
}
public static void main(String[] args)
{
FacadeTest facade = new FacadeTest();
facade.createUI();
}
}
7. 참고
http://en.wikipedia.org/wiki/Facade_pattern