디자인패턴 7. Facade Pattern

1. Facade Pattern

  • Facade는 건물의 앞쪽 정면 이라는 뜻을 가진다.(뒤쪽은 모른다)
  • 여러 개의 객체와 실제 사용하는 서브 객체의 사이에 복잡한 의존관계가 있을 때, 중간에 facade라는 객체를 두고, 여기서 제공하는 interface만을 활용하여 기능을 사용하는 방식이다.
  • Facade는 자신이 가지고 있는 각 클래스의 기능을 명확히 알아야 한다
    • 여러 개의 객체를 합쳐서 특정 기능을 만들 때 사용

2. 프로젝트 테스트

  • Class : Ftp, Reader, Writer, SftpClient
    • SftpClient == Facade

01. Facade 적용 전

  • Ftp.java
package com.company.design.facade;

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;
    }
    
    public void connect() {
        System.out.println("FTP HOST : "+host+" Port : "+port+" 로 연결 합니다.");
    }
    
    public void moveDirectory() {
        System.out.println("path : "+path+"로 이동 합니다.");
    }
    
    public void disConnect() {
        System.out.println("FTP 연결을 종료 합니다");
    }
}
  • Reader.java
package com.company.design.facade;

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 fileDisConnector() {
        String msg = String.format("Reader %s로 연결 종료 합니다.", fileName);
        System.out.println(msg);
    }
}
  • Writer.java
package com.company.design.facade;

public class Writer {

    private String fileName;

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

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

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

    public void write() {
        String msg = String.format("WRITER %s로 파일 쓰기를를 합니.", fileName);
        System.out.println(msg);
    }
}
  • Main.java
package com.company.design;

import com.company.design.facade.Ftp;
import com.company.design.facade.Reader;
import com.company.design.facade.Writer;

public class Main {

    public static void main(String[] args) {
        Ftp ftpClient = new Ftp("www.foo.co.kr", 22, "/home/etc");
        ftpClient.connect();
        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.fileDisConenct();
        ftpClient.disConnect();

    }
}

02. Facade 적용 후

  • SftpClient.java
package com.company.design.facade;

public class SftpClient {

    private Ftp ftp;
    private Reader reader;
    private Writer writer;

    public SftpClient(Ftp ftp, Reader reader, Writer writer) {
        this.ftp = ftp;
        this.reader = reader;
        this.writer = writer;
    }

    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.fileDisConenct();
        reader.fileConnect();
    }

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

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

    public void write() {
        writer.write();
    }
}
  • Main.java
package com.company.design;

import com.company.design.facade.Ftp;
import com.company.design.facade.Reader;
import com.company.design.facade.SftpClient;
import com.company.design.facade.Writer;

public class Main {

    public static void main(String[] args) {
        Ftp ftpClient = new Ftp("www.foo.co.kr", 22, "/home/etc");
        ftpClient.connect();
        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.fileDisConenct();
        ftpClient.disConnect();

        System.out.println("\n-------------------\n");

        SftpClient sftpClient = new SftpClient("www.foo.co.kr", 22, "/home/etc", "text.tmp");
        sftpClient.connect();
        sftpClient.write();
        sftpClient.read();
        sftpClient.disConnect();

    }
}

좋은 웹페이지 즐겨찾기