7. 파사드 Facade Pattern 개념 및 실습

Yeppi's 개발 일기·2022년 5월 13일
0

디자인패턴

목록 보기
7/8
post-thumbnail

1. 개념

중간 다리 역할

  • 건물의 앞쪽 정면을 가리킴 → 뒷쪽은 알지 못함

  • 여러 객체-실제 사용하는 서브 객체 사이에 복잡한 의존관계가 있을 때
    중간에 Facade 라는 객체를 두고, 여기서 제공하는 interface만을 활용하여 기능을 사용

  • 자신이 가지고 있는 각 클래스의 기능 및 제공하는 인터페이스에 대해 명확히 알아야 함


2. 실습

  • 파일 전송 프로토콜 FTP, Reader, Writer 기능을 파사드 객체가 모아 중간 다리 역할을 수행

  • 각 기능을 오버로딩하여, 새로운 인터페이스를 만듦

  • 해당 기능을 사용할 때는 퍼사드 객체 하나만 불러오면 해결


FTP, Reader, Writer 기능

  • FTP
public class Ftp {
    private String host;
    private int port;
    private String path;

    public Ftp(String host, int port, String path) {
        this.host = host;
        this.port = port;
        this.path = path;
    }

    // FTP 연결
    public void connect() {
        System.out.println("FTP Host : " + host + ", Port : " + port + " 로 연결 합니다.");
    }

    // 해당 디렉토리 이동
    public void moveDirectory() {
        System.out.println("FTP path : " + path + "로 이동 합니다. ");
    }

    // FTP 연결 종료
    public void disConnect() {
        System.out.println("FTP 연결을 종료 합니다.");
    }

}
  • Reader
public class Reader {
    private String fileName;

    public Reader(String fileName) {
        this.fileName = fileName;
    }

    // 파일 연결
    public void fileConnect() {
        String msg = String.format("Reader %s 로 연결 합니다.", fileName);
        System.out.println(msg);
    }

    // 파일 읽기
    public void fileRead() {
        String msg = String.format("Reader %s 의 내용을 읽어 옵니다.", fileName);
        System.out.println(msg);
    }

    // 파일 연결 종료
    public void fileDisconnect() {
        String msg = String.format("Reader %s 로 연결 종료 합니다.", fileName);
        System.out.println(msg);
    }

}
  • Writer
public class Writer {
    private String fileName;

    public Writer(String fileName) {
        this.fileName = fileName;
    }

    // 파일 생성
    public void fileConnect() {
        String msg = String.format("Reader %s 로 연결 합니다.", fileName);
        System.out.println(msg);
    }

    // 파일 이어쓰기
    public void write() {
        String msg = String.format("Reader %s 로 파일 쓰기를 합니다.", fileName);
        System.out.println(msg);
    }

    // 파일 종료
    public void fileDisconnect() {
        String msg = String.format("Reader %s 로 연결 종료 합니다.", fileName);
        System.out.println(msg);
    }


}
© 2022 GitHub, Inc.
Terms

Facade 기능

  • 위 3가지 기능을 함께 모으기

  • SftpClient

// Facade 객체로 Ftp, Reader, Writer 기능 모아서 제공
public class SftpClient {
    private  Ftp ftp;
    private Reader reader;
    private Writer writer;

    // 객체를 한 번 감싸서, 의존성은 SftpClient 가 전부 가져김
    public SftpClient(Ftp ftp, Reader reader, Writer writer) {
        this.ftp = ftp;
        this.reader = reader;
        this.writer = writer;
    }

    // 오버로딩 -> 새로운 인터페이스 제공(Facade 의 핵심 역할)
    public SftpClient(String host, int port, String path, String fileName) {
        this.ftp = new Ftp(host, port, path);
        this.reader = new Reader(fileName);
        this.writer = new Writer(fileName);
    }

    public void connect() {
        ftp.connect();
        ftp.moveDirectory();
        writer.fileConnect();
        reader.fileConnect();
    }

    public void disConnect() {
        writer.fileDisconnect();
        reader.fileDisconnect();
        ftp.disConnect();
    }

    public void read() {
        reader.fileRead();
    }

    public void write() {
        writer.write();
    }
}

출력 결과

  • main
        Ftp ftpClient = new Ftp("www.foo.co.kr", 22, "/home/etc");
        ftpClient.connect(); // FTP 연결
        ftpClient.moveDirectory(); // 해당 디렉토리로 이동
        
        Writer writer = new Writer("text.tmp");
        writer.fileConnect(); // 해당 파일 연결
        writer.write(); // 파일에 내용 쓰기
        
        Reader reader = new Reader("text.tmp");
        reader.fileConnect(); // 쓴 파일 읽기 위해 파일 연결
        reader.fileRead(); // 파일 읽기
        
        // 읽은 후, 연결 끊기
        reader.fileDisconnect();
        writer.fileDisconnect();
        ftpClient.disConnect();
  • 위처럼 하나하나 객체 생성 후, 기능을 구현해야하는 번거러움
  • 파사드로 공통된 인터페이스를 사용하여 간편하게 구현
        // 각각 다 method 호출해야하는 번거로움 + 각 객체의 의존성
        // Facade 를 통해서, 한 번에 해결
        SftpClient sftpClient = new SftpClient("www.foo.co.kr", 22, "/home/etc", "text.tmp");
        sftpClient.connect();
        sftpClient.write();
        sftpClient.read();
        sftpClient.disConnect();
profile
imaginative and free developer. 백엔드 / UX / DATA / 기획에 관심있지만 고양이는 없는 예비 개발자👋

0개의 댓글