Facade pattern
- façade : (프) 건물의 정면. 건물 뒷면에 뭐가 있는지 모름…
- 여러개의 객제와 실제 사용하는 서브객체 사이의 복잡한 의존관계가 존재할때, 중간에 facade라는 객체를 두고, 여기서 제공하는 interface만을 활용하여 기능을 사용하는 방식.
- 각 인터페이스와 클래스의 기능을 명확히 알아야 한다.
- 실제 ftp client를 생각해보면 이해에 도음이 된다.
- 각 ftp, writer, reader는 커넥션과 커넥션 클로즈 같은 메소드를 각각 필요로 하게 되는데 이경우 중간에 facade를 둠으로서 그 혼재된 상황정리해서 facade가 다양한 메서드를 제공하게 된다. 실제 아래 예시도 이와 같은 형태로 구현될 예정이다.
예제코드 (FTP Client)
facade 적용 전
클라이언트 각 클래스들(FTP, Writer, Reader)
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+", path : "+ path);
}
public void moveDirectory(){
System.out.println("FTP path : "+ path+"로 이동합니다.");
}
public void disconnect(){
System.out.println("FTP 연결을 종료합니다.");
}
}
public class Writer{
private String fileName;
public Writer(String fileName) {
this.fileName = fileName;
}
public void fileConnect() {
System.out.println("Writer "+ this.fileName+"로 연결 합니다.");
}
public void write() {
System.out.println("Writer "+ this.fileName+"로 파일을 씁니다.");
}
public void fileDisconnect() {
System.out.println("Writer "+ this.fileName+"연결 종료합니다.");
}
}
public class Reader {
private String fileName;
public Reader(String fileName) {
this.fileName = fileName;
}
public void fileConnect() {
System.out.println("Reader "+ this.fileName+"로 연결 합니다.");
}
public void fileRead() {
System.out.println("Reader "+ this.fileName+"의 내용을 읽어옵니다.");
}
public void fileDisconnect() {
System.out.println("Reader "+ this.fileName+"연결 종료합니다.");
}
}
실행코드
- facade 적용 전 : 실제 코드 사용시 메서드 호출 순서가 매우 중요해지고, 호출하는 메서드도 많다.
public class Main { public static void main(String[] args){ FTP ftpClient = new FTP("www.test.co.kr", 22, "/home/test"); ftpClient.connect(); ftpClient.moveDirectory(); Writer writer = new Writer("test.txt"); writer.fileConnect(); writer.write(); Reader reader = new Reader("test.txt"); reader.fileConnect(); reader.fileRead(); reader.fileDisconnect(); writer.fileDisconnect(); ftpClient.disconnect(); } }
파사드 패턴 구현 (기존 객체 조합해서 하나의 창구(?)가 됨.)
Facade형태 객체 생성
public class SftpClient {
private Ftp ftp;
private Writer writer;
private Reader reader;
public SftpClient(Ftp ftp, Writer writer, Reader reader) {
this.ftp = ftp;
this.writer = writer;
this.reader = reader;
}
public SftpClient(String host, int port, String path, String fileName) {
this.ftp = new FTP(host, port, path);
this.writer = new Writer(fileName);
this.reader = new Reader(fileName);
}
public void connet() {
ftp.connect();
ftp.moveDirectory();
writer.fileConnect();
reader.fileConnect();
}
public void disconnect() {
reader.fileDisconnect();
writer.fileDisconnect();
ftpClient.disconnect();
}
public void read() {
reader.fileRead();
}
public void write() {
writer.write();
}
}
실행코드
-
파서드 패턴 적용 후 , 각 객체안의 메소드를 각각 불러주고 순서를 고려했던것과는 다르게 정리된 코드를 확인할 수 있다. ```java public class Main {
public static void main(String[] args){ SftpClient sftpClient = new FTP(“www.test.co.kr”, 22, “/home/test”,”test.txt”); sftpClient.connect(); sftpClient.write(); sftpClient.read(); sftpClient.disconnect(); }
} ```
Comments