본문 바로가기
Java

java - 파사드 패턴(구조 패턴)

by sinabeuro 2021. 8. 24.
728x90

Facade pattern

Facade는 건물의 앞쪽 정면이라는 뜻으로, 파사드 패턴은 건물의 뒤쪽은 모르는 형태를 뜻합니다.

여러개의 객체를 합쳐서 특정을 기능을 만들 때 사용합니다.

여러개의 객체와 실제 사용하는 서브 객체의 사이에 복잡한 의존관계가 있을 때, 중단에 facade라는 객체를 두고, 여기서 제공하는 interface만을 활용하여 기능을 사용하는 방식입니다.

여러개의 의존성을 파사드 객체 안 쪽으로 감추고 파사드 객체만 컨트롤해서 기능을 동작하는 것입니다.

Facade pattern을 구현하기 위해서는 Facade는 자신이 가지고 있는 각 클래스의 기능을 명확히 알아야 합니다.

 

파사드 패턴의 예로 http 클라이언트를 들수있습니다.

 

// FtpProtocol.java
public class FtpProtocol {

    public FtpProtocol(String host, int port, String path){
        System.out.println("ftp server create");
    }

    public void connect(){
        System.out.println("ftp server connected");
    }

    public void moveDirectory(){
        System.out.println("move path");
    }

    public void disConnect(){
        System.out.println("ftp server disConnected");
    }
}

 

// FileReader.java
public class FileReader {

    private String fileName;

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

    public void fileConnect(){
        System.out.println("FileReader Connected");
    }

    public String fileRead(){
        return "content";
    }

    public void fileDisconnect(){
        System.out.println("FileReader disConnected");
    }
}

 

// FileWriter.java
public class FileWriter {

    private String fileName;

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

    public void fileConnect(){
        System.out.println("FileWriter Connected");
    }

    public void fileWrite(String content){
        System.out.println("write : "+content);
    }

    public void fileDisconnect(){
        System.out.println("FileWriter disConnected");
    }
}

 

// SftpClient.java
public class SftpClient {

    private FtpProtocol ftpProtocol;
    private FileReader fileReader;
    private FileWriter fileWriter;

    public SftpClient(String host, int port, String path, String fileName){
        this.ftpProtocol = new FtpProtocol(host, port, path);
        this.fileReader = new FileReader(fileName);
        this.fileWriter = new FileWriter(fileName);
    }

    public void connect(){
        this.ftpProtocol.connect();
        this.ftpProtocol.moveDirectory();
        this.fileReader.fileConnect();
        this.fileWriter.fileConnect();

    }

    public void write(String content){
        this.fileWriter.fileWrite(content);
    }

    public String read(){
        return this.fileReader.fileRead();
    }

    public void disConnect(){
        this.fileReader.fileDisconnect();
        this.fileWriter.fileDisconnect();
        this.ftpProtocol.disConnect();
    }

}

파사드 클래스를 만들어서, 유사하거나 상호작용하는 여러 객체들의 메소드를 한번에 실행할 수 있는 메소드를 작성합니다.

파사드 클래스 생성자에 여러 객체를 한번에 인스턴스 객체를 생성할 수 있도록 구성할 수도 있습니다.

 

// Main.java
public class Main {

    public static void main(String[] args) {

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

    public static void connect(Electronic110V electronic110V) {
        electronic110V.powerOn();
    }
}

 

FtpProtocol, FileReader, FileWriter 등의 클래스로 객체를 생성하는 것이 아니라, SftpClient(파사드 클래스)를 통해서 인스턴스 객체를 생성하고 메소드를 호출합니다. 

이는 개별 클래스 객체를 만들고 메소드를 호출하는 방식이 아닌, 파사드 클래스를 통해서 일괄적으로 객체를 만들고 메소드를 호출합니다. 

즉, 파사드 클래스로 나머지 클래스의 역할을 묶음으로써, 클래스들의 기능을 감추고 파사드 클래스만으로 비지니스 로직을 컨트롤합니다.

 

 

728x90

댓글