본문 바로가기

JAVA/디자인 패턴

7. Facade pattern

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

public class FTP {

    private String host;
    private int port;
    private String path;

    public FTP(String host, int port, String path){
        this.host = host;
        this.path = path;
        this.port = port;
    }
    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 연결을 종료 합니다.");

    }
}
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("Writer %s 로 연결 합니다",fileName);
        System.out.println(msg);
    }

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

FTP ftpClient = new FTP("www.foo.co.kr", 22, "/home/etc");

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();

 

개별적으로 코딩을 진행했다. 클라이언트 각각 의존성이 있어 관리하기가 어렵다.

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.fileConnect();
        reader.fileConnect();
    }
    public void disConnect(){
        writer.fileDisconnect();
        reader.fileDisconnect();
        ftp.disConnect();
    }
    public void read(){
        reader.fileRead();
    }
    public void writer(){
        writer.write();
    }
}

이렇게 만든다면 객체를 한 번 감쌈으로써 SftpClient가 의존성을 다 가져가며 새로운 인터페이스를 제공하게 된다.

 

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

sftpClient.write();

sftpClient.read();

sftpClient.disConnect();

 각각의 객체에 의존하기보다는 Facade 패턴을 적용시키면 한 객체에 모든 의존성을 가진 새로운 인터페이스를 제공할 수 있게 해준다. 더 간략해 지고 같은 기능을 제공할 수 있다.

 

 

'JAVA > 디자인 패턴' 카테고리의 다른 글

8. 전략 패턴  (0) 2022.06.29
6. 옵저버 패턴  (0) 2022.06.29
5. 데코레이터 패턴  (0) 2022.06.25
4. 프록시(Proxy) 패턴  (0) 2022.06.25
3. 어뎁터 패턴  (0) 2022.06.24