Facade Pattern

Muzi·2023년 6월 4일
0

디자인 패턴

목록 보기
10/14
post-thumbnail

크고 복잡한 클래스들을 처리하기 위한 창구
즉, 복잡하고 많은 인터페이스들을 하나의 통합된 인터페이스로 묶는 패턴

어댑터 패턴과의 차이

  • 둘다 구조 패턴으로 거의 같은 방식으로 작동하지만 목적이 다르다

  • 어댑터 패턴: 인터페이스를 다른 인터페이스로 변환시키기 위한 용도

  • 퍼사드 패턴: 인터페이스를 단순화시키기 위한 용도


예시

: 웹 페이지를 만드는 프로그램

  • Database class - 이메일 주소에서 사용자 이름을 얻는 클래스

  • Html Writer - Html 파일을 작성하는 클래스

  • PageMaker class - 이메일 주소로 사용자의 웹 페이지를 작성하는 클래스

Database class

  • properties 클래스를 간이 DB로 간주
  • get으로 properties 인스턴스를 얻는다
public class Database {
	private Database() {
    }
    
    public static Properties getProperties(String dbname) throws Exception {
    	String filename = dbname + ".txt";
        Properties prop = new Properties();
        prop.load(new FileReader(filename));
        return prop;
    }
}

HtmlWriter class

  • 웹 페이지를 만드는 클래스
  • 인스턴스 생성 시 Writer를 주고 그 writer에 HTML을 출력
public class HtmlWriter {

    private Writer writer;

    public HtmlWriter(Writer writer) {  

        this.writer = writer;

    }

	// 제목 출력
    public void title(String title) throws IOException {    

        writer.write("<html>");

        writer.write("<head>");

        writer.write("<title>" + title + "</title>");

        writer.write("</head>");

        writer.write("<body>\n");

        writer.write("<h1>" + title + "</h1>\n");

    }
	// 단락 출력
    public void paragraph(String msg) throws IOException {  

        writer.write("<p>" + msg + "</p>\n");

    }
	// 링크 출력
    public void link(String href, String caption) throws IOException {  

        paragraph("<a href=\"" + href + "\">" + caption + "</a>");

    }

    public void mailto(String mailaddr, String username) throws IOException {   

        link("mailto:" + mailaddr, username);

    }
	// html 닫기
    public void close() throws IOException {  

        writer.write("</body>");

        writer.write("</html>\n");

        writer.close();

    }

}

PageMaker class

  • HtmlWriter class의 메소드를 호출하는 복잡한 부분을 pageMaker클래스가 도맡는다
  • 외부에는 makeWelcomePage 메소드 단 하나만 보여준다
public class PageMaker {

    private PageMaker() {   

    }

    public static void makeWelcomePage(String mailaddr, String filename) {

        try {

            Properties mailprop = Database.getProperties("maildata");

            String username = mailprop.getProperty(mailaddr);

            HtmlWriter writer = new HtmlWriter(new FileWriter(filename));

            writer.title("Welcome to " + username + "'s page!");

            writer.paragraph(username + "의 페이지에 오신 걸 환영합니다.");

            writer.paragraph("메일을 기다리고 있습니다.");

            writer.mailto(mailaddr, username);

            writer.close();

            System.out.println(filename + " is created for " + mailaddr + " (" + username + ")");

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

}

Main class

public class Main {
	public static void main(String[] args) {
    	PageMaker.makeWelcomePage("wonseok@example.com", "hello.html");
    }
}

결론

  • 핵심은 client에게(프로그래머) 제공하는 인스턴스의 수를 줄이는것
  • 인터페이스가 적다는건 외부와의 결합이 느슨하다는 것 = 재사용이 쉬워진다
  • 창구라해서 모든 인터페이스를 넣을 수 있는 건 아니다 통합시킬 저수준 인턴페이스들도 간단하게 만들어야 facade가 간단해진다
profile
좋아하는걸 열심히

0개의 댓글