728x90
반응형
Facade Pattern
Facade는 건물의 안쪽 정면이라는 뜻으로, 여러 개의 객체와 실제 사용하는 서브 객체 사이에 복잡한 의존관계가 있을 때, 중간에 Facade라는 객체를 두고, 여기서 제공하는 interface만을 활용하여 기능을 사용하는 방식입니다.
Facade Pattern 적용 전
[Ftp class]
package Java.facadePattern;
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 + " 로 연결합니다.");
}
public void moveDirectory(){
System.out.println("FTP Path: " + path + " 로 이동합니다.");
}
public void disConnect(){
System.out.println("FTP 연결을 종료합니다.");
}
}
[Reader class]
package Java.facadePattern;
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);
}
}
[Writer class]
package Java.facadePattern;
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 fileWrite(){
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);
}
}
각각의 기능들을 class 자체에 구현하여 사용합니다.
[FacadeMain class]
package Java.facadePattern;
public class FacadeMain {
public static void main(String[] args) {
Ftp ftpClient = new Ftp("lakelight.co.kr", 22, "/home/post");
ftpClient.connect();
ftpClient.moveDirectory();
Writer writer = new Writer("Welcome.txt");
writer.fileConnect();
writer.fileWrite();
Reader reader = new Reader("Welcome.txt");
reader.fileConnect();
reader.fileRead();
writer.fileDisconnect();
reader.fileDisconnect();
ftpClient.disConnect();
}
}
Main에서도 각각의 기능들을 인스턴스에서 메서드를 호출하여 사용하였습니다.
Facade Pattern 적용 후
[FtpClientForFacade class 추가]
package Java.facadePattern;
public class FtpClientForFacade {
private Ftp ftp;
private Reader reader;
private Writer writer;
//객체로 한번 감싸면서 FtpClientForFacade가 모든 의존성을 가집니다.
public FtpClientForFacade(Ftp ftp, Reader reader, Writer writer) {
this.ftp = ftp;
this.reader = reader;
this.writer = writer;
}
public FtpClientForFacade(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);
}
//새로운 인터페이스 제공 (connect, disConnect, read, write)
public void connect(){
ftp.connect();
ftp.moveDirectory();
writer.fileConnect();
reader.fileDisconnect();
}
public void disConnect(){
writer.fileDisconnect();
reader.fileDisconnect();
ftp.disConnect();
}
public void read(){
reader.fileRead();
}
public void write(){
writer.fileWrite();
}
}
객체로 기존의 객체를 한번 감싸면서 필요했던 의존성을 FtpClientForFacade가 가져갔고, 오버로딩을 통해 의존성을 주입합니다. 그리고 메서드를 더 만들어서 새로운 인터페이스를 제공합니다.
[FacadeAppliedMain class]
package Java.facadePattern;
public class FacadeAppliedMain {
public static void main(String[] args) {
FtpClientForFacade ftpClientForFacade = new FtpClientForFacade("lakelight.co.kr", 22, "/home/post", "Welcome.txt");
ftpClientForFacade.connect();
ftpClientForFacade.write();
ftpClientForFacade.read();
ftpClientForFacade.disConnect();
}
}
퍼사드 패턴이 적용되기 전의 코드보다 코드가 간결해졌습니다.
결론
퍼사드 패턴을 적용하므로써 하위 객체간의 결합도를 낮추고,
Client입장에서 하위 객체를 사용해야할 때 다루어야할 객체의 수를 줄여줍니다.
또한 코드가 간결해져서 가독성을 높여줄 수 있습니다.
728x90
반응형
'JAVA' 카테고리의 다른 글
[Java] JDK 동적 프록시 (0) | 2022.08.24 |
---|---|
[Java] Reflection (0) | 2022.08.24 |
[Java] Observer Pattern (0) | 2022.08.01 |
[Java] Decorator Pattern - Example Car (0) | 2022.08.01 |
[Java] Proxy Pattern - AOP (0) | 2022.07.31 |