퍼사드(Facade) 패턴

퍼사드 패턴은 복잡한 서브시스템을 간단하게 사용할 수 있도록 인터페이스를 제공하는 디자인 패턴입니다.
이 패턴을 사용하면 클라이언트는 서브시스템과의 상호작용을 단순화할 수 있으며, 서브시스템의 복잡성을 감추고 코드의 유지보수성을 향상시킬 수 있습니다.

구성 요소

퍼사드(Facade): 클라이언트와 서브시스템 사이의 단일 인터페이스를 제공합니다. 서브시스템의 복잡성을 감추고, 클라이언트와의 상호작용을 단순화합니다.
서브시스템(Subsystems): 실제 작업을 처리하는 클래스들의 집합입니다. 퍼사드에 의해 사용됩니다.
클라이언트(Client): 퍼사드를 통해 서브시스템과 상호작용합니다.

구현:

  1. 서브시스템 클래스들을 생성합니다. 이들 클래스는 실제 작업을 처리하며, 클라이언트에 직접 노출되지 않습니다.
  2. 퍼사드 클래스를 생성합니다. 이 클래스는 클라이언트와 서브시스템 사이의 단일 인터페이스를 제공합니다. 퍼사드 내부에서는 서브시스템의 작업을 조정하고 호출합니다.
  3. 클라이언트는 퍼사드를 사용하여 서브시스템과의 상호작용을 단순화합니다.

장점

복잡한 서브시스템을 단순한 인터페이스로 제공하여 클라이언트의 사용을 용이하게 합니다. 서브시스템의 복잡성을 감추고 코드의 유지보수성을 향상시킵니다. 클라이언트와 서브시스템 사이의 결합도를 낮춥니다.

단점

퍼사드 클래스가 과도하게 많은 역할을 담당할 경우, 단일 책임 원칙을 위배할 수 있습니다. 퍼사드 클래스의 변경이 전체 시스템에 영향을 미칠 수 있습니다.

예시

Email을 보내는 과정에서 Properties, Session, MimeMessage, Transport 등 다양한 객체를 사용해야한다

Subsystems

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;

Facade

public class EmailFacade {

    public static void send(String to, String from, String subject, String text, String host) {
        Properties properties = System.getProperties();
        properties.setProperty("mail.smtp.host", host);

        Session session = Session.getDefaultInstance(properties);

        try {
            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(from));
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
            message.setSubject(subject);
            message.setText(text);

            Transport.send(message);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}

Client

class EmailFacadeTest {

    @Test
    public void send_test() {
        String to = "kktrkkt@kktrkkt.me";
        String from = "kktrkkt@kktrkkt.me";
        String subject = "Test Mail from Java Program";
        String text = "message";
        String host = "127.0.0.1";

        EmailFacade.send(to, from, subject, text, host);
    }

}

결론

퍼사드 패턴은 복잡한 서브시스템을 간단한 인터페이스로 제공하여 클라이언트의 사용을 용이하게 합니다. 서브시스템의 복잡성을 감추고, 코드의 유지보수성을 향상시키고,
클라이언트와 서브시스템 사이의 결합도를 낮추어 시스템의 유연성과 확장성을 향상시킵니다.
단, 퍼사드 클래스가 과도하게 많은 역할을 담당할 경우, 단일 책임 원칙을 위배할 수 있습니다.
퍼사드 클래스의 변경이 전체 시스템에 영향을 미칠 수 있으므로, 주의하여 사용해야 합니다.

예제는 이곳 에서 확인하실수 있습니다.