중간 다리 역할
건물의 앞쪽 정면을 가리킴 → 뒷쪽은 알지 못함
여러 객체-실제 사용하는 서브 객체 사이에 복잡한 의존관계가 있을 때
중간에 Facade 라는 객체를 두고, 여기서 제공하는 interface만을 활용하여 기능을 사용
자신이 가지고 있는 각 클래스의 기능 및 제공하는 인터페이스에 대해 명확히 알아야 함
파일 전송 프로토콜 FTP, Reader, Writer 기능을 파사드 객체가 모아 중간 다리 역할을 수행
각 기능을 오버로딩하여, 새로운 인터페이스를 만듦
해당 기능을 사용할 때는 퍼사드 객체 하나만 불러오면 해결
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 연결을 종료 합니다.");
}
}
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);
}
}
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
위 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();
}
}
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();