220202_스프링입문_디자인패턴_파사드 패턴_패스트캠퍼스 챌린지 10일차
<2022년 02월 012일 _ 패스트캠퍼스 챌린지 10일차>
[스프링입문_디자인패턴_파사드 패턴]
1. Facade Pattern
: 건물의 앞쪽 정면이라는 뜻
: 여러개의 객체와 실제 사용하는 서브 객체의 사이에 복잡한 의존관계가 있을때, 중간에 facade라는 객체의 interface만을 활용해 기능을 사용하는 방식
: 자신이 가지고 있는 각 클래스의 기능을 명확히 알아야 함
2. 실습
(1) com.company.design 패키지에 facade 패키지 추가 & Ftp, Writer, Reader 클래스 추가
(2) facade패턴이 적용되지 않은 형태 먼저 실습
Ftp 클래스 작성
package com.company.design.facade;
public class Ftp {
//포트 22번으로 특정한 호스트에 붙어야 함
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 + " Prot : "+ port + "로 연결합니다.");
}
public void moveDirectory(){
System.out.println("path : " + path + "로 이동합니다.");
}
public void disConnect(){
System.out.println("FTP 연결을 종료합니다.");
}
}
Reader 클래스 작성
package com.company.design.facade;
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 클래스 작성
package com.company.design.facade;
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);
}
}
(3) Main문 작성(facade패턴이 적용되지 않은 형태)
package com.company.design;
import com.company.design.facade.Ftp;
import com.company.design.facade.Reader;
import com.company.design.facade.Writer;
public class Main {
public static void main(String[] args) {
//facade패턴이 적용되지 않은 형태
Ftp ftpClient = new Ftp("www.foo.co.kr", 22, "/home/etc");
ftpClient.connect();
ftpClient.moveDirectory();
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();
}
}
(4) Facade 패턴이 적용된 형태 만들기 (SftpClient 추가)
SftpClient
package com.company.design.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(){
reader.fileDisconnect();
writer.fileDisconnect();
ftp.disConnect();
}
public void read(){
reader.fileRead();
}
public void write(){
writer.fileWrite();
}
}
(5) Facade 패턴이 적용된 형태 만들기 (Main문 작성)
package com.company.design;
import com.company.design.facade.Ftp;
import com.company.design.facade.Reader;
import com.company.design.facade.SftpClient;
import com.company.design.facade.Writer;
public class Main {
public static void main(String[] args) {
//facade패턴이 적용되지 않은 형태
System.out.println("facade패턴이 적용되지 않은 형태");
Ftp ftpClient = new Ftp("www.foo.co.kr", 22, "/home/etc");
ftpClient.connect();
ftpClient.moveDirectory();
Writer writer = new Writer("text.tmp");
writer.fileConnect();
writer.fileWrite();
Reader reader = new Reader("text.tmp");
reader.fileConnect();
reader.fileRead();
reader.fileDisconnect();
writer.fileDisconnect();
//facade패턴이 적용된 형태
System.out.println("facade패턴이 적용된 형태");
SftpClient sftpClient = new SftpClient("www.foo.co.kr", 22, "/home.etc", "text.tmp");
sftpClient.connect();
sftpClient.write();
sftpClient.read();
sftpClient.disConnect();
}
}
결론:
Facade 패턴을 적용하면, 기능 자체는 기존과 동일하나 바깥쪽에서는 코드가 간결해지고, 기존 기능을 인터페이스 해주는 형태로 코드가 구현된다.
10일차 강의 완료~
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'개발새발 > Spring' 카테고리의 다른 글
220204_스프링입문_웹 개발 개론_웹 개발이란_패스트캠퍼스 챌린지 12일차 (0) | 2022.02.04 |
---|---|
220203_스프링입문_디자인패턴_전략 패턴_패스트캠퍼스 챌린지 11일차 (0) | 2022.02.03 |
220201_스프링입문_디자인패턴_옵저버 패턴_패스트캠퍼스 챌린지 09일차 (0) | 2022.02.01 |
220131_스프링입문_디자인패턴_데코레이터패턴_패스트캠퍼스 챌린지 08일차 (0) | 2022.01.31 |
220130_스프링입문_디자인패턴_프록시패턴_패스트캠퍼스 챌린지 07일차 (0) | 2022.01.30 |