Facade Pattern
: 어떤 서브시스템의 일련의 인터페이스에 대한 통합된 인터페이스를 제공한다. <img width=550px src=./img/facade-diagram.png>
- Facade는 건물의 앞쪽 정면 이라는 뜻을 가진다.
- Facade는 자신이 가지고 있는 각 클래스의 기능을 정확히 알아야 한다.
- Facade 패턴은 어떤 서브시스템에 대한 간단한 인터페이스로 제공하는 것이다. → FTP를 사용할때 그 안에 있는 로직을 직접 사용한다고 생각해보자 끔찍하다.
- 전자레인지를 생각해보자. 우리는 전자레인지의 기능만 알고 사용하지 그안에 동작원리까지 알고 사용하는가?
→ 우리는 전자레인지의 버튼이 어떤 역활인지만 알면된다.
Facade Pattern의 예시
간단한 FTP client 형식적으로 만들어보자
- FTP는 연결할 수 있고 디렉토리를 연결할 수 있고 연결을 끊을 수 있다.
- Reader는 연결할 수 있고, 파일의 내용을 읽을 수 있고, 연결을 끊을 수 있다.
- Reader는 연결할 수 있고, 파일의 내용을 쓸 수 있고, 연결을 끊을 수 있다.
퍼사트 패턴의 적용 전
<img width=350px src=./img/before-facade.png>
FTP class
public class Ftp{
private String host;
private int port;
private String path;
public Ftp(String host, int port, String path){
this.host = hose;
this.prot = prot;
this.path = path;
}
public void connect(){
System.out.println("FTP host: "+ host + "Prot: " + prot + "로 연결합니다.")
}
public void moveDir(){
System.out.println(path + "로 연결을 종료합니다.");
}
public void disconnect(){
System.out.println("연결을 종료합니다.");
}
}
file을 읽어오는 Reader class
public class Reader{
private String fileName;
public Reader(String fileName){
this.fileName = fileName;
}
public void fileConnect(){
System.out.println("Reader: "+ fileName +" 로 연결합니다.");
}
public void fileRead(){
System.out.println("Reader: "+ fileName +" 의 내용을 읽어옵니다..");
}
public void fileDisconnect(){
System.out.println("Reader: "+ fileName +" 로 연결을 종료합니다.");
}
}
file을 삽입하는 Writer class
public class Writer{
private String fileName;
public Writer(String fileName){this.fileName=fileName}
public void fileConnect(){
System.out.println("Writer: "+ fileName +" 로 연결합니다.");
}
public void write(){
System.out.println("Writer: "+ fileName +" 로 파일쓰기를 합니다..");
}
public void fileDisconnect(){
System.out.println("Writer: "+ fileName +" 로 연결을 종료합니다.");
}
}
결과 main method
public class main{
public static void main(String[] args){
Ftp ftp = new Ftp("www.foo.com", 22, "/home/etc");
ftp.connect();
ftp.moveDir();
Writer writer = new Writer("text.tmp");
writer.fileConnect();
writer.write();
Reader reader = new Reader("text.tmp");
reader.connect();
reader.fileRead()
reader.disConnect();
writer.disConnect();
ftp.disConnect();
}
}
- 클라이언트(개발자)가 Ftp기능을 사용하려면 Ftp, Writer, Reader의 객체가 어떻게 동작하는지 알아야 한다.
- 퍼사드 객체를 통해 이 문제를 해결 할 수있다.
퍼사트 패턴의 적용 후
<img width=300px src=./img/after-fasade.png>
ftp의 퍼사드인 sftpClient Class
public class SftpClient{
private Ftp ftp;
private Writer writer;
private Reader reader;
public SftpClient(Ftp ftp, Reader reader, Writer writer){
this.ftp = ftp;
this.reader = reader;
this.writer = writer;
}
public SftpClient(String host, int prot, String path, String fileName){
this.ftp = new Ftp(host, prot, path);
this.reader = new Reader(fileName);
this.writer = new Writer(fileName);
}
public void connect(){
ftp.connect();
ftp.moveDir();
reader.connect();
writer.connect();
}
public void disconnect(){
reader.FileDisconnect();
writer.FIleDisconnect();
ftp.disconnect();
}
public void read(){
reader.fileRead();
}
public void writer(){
writer.write();
}
}
결과
public class Main{
public static void main(String[] args){
SftpClient sftpClient = new SftpClient("www.foo.com", 22, "/home/etc", "text.tmp");
sftpClient.connect();
sftpClient.write();
sftpClient.read();
sftpClient.disconnect()
}
}
- 클라이언트는 굉장히 간단하게 FTP기능을 간단하게 사용할 수 있다.