You will be fine

<디자인패턴입문> 12. Facade 패턴

by BFine
반응형

www.yes24.com/Product/Goods/2918928

 

Java 언어로 배우는 디자인 패턴 입문

이 책은 디자인 패턴의 입문서입니다. GoF가 정리한 23개의 디자인 패턴을 하나씩 다루면서 객체 지향을 잘 모르는 초보자도 이해하기 쉽도록 정리하고 있습니다. 단순한 이론이나 논리을 제시하

www.yes24.com

 

가. 무엇인가

 a. 창구는 열려있습니다

  -  프로그램은 점점 커진다. 그러면서 많은 클래스간 서로 관계를 맺으면서 복잡하게 된다.

      => 어떤 기능을 처리하기 위해 상호 관련된 많은 클래스를 적절하게 제어가 필요하다!

  -  처리를 실행하기 위한 창구를 준비해 두는 것이 좋다!

      => 창구를 두면 개별적으로 제어하지 않아도 해당 창구에 대해서만 요구하면 역할이 끝나기 때문!

   - facade(퍼사드) 패턴은 건물의 정면이라는 의미를 가지고 있고 외부에 대해서는 단순한 인터페이스만을 보여준다.  

 

나. 만들어본 예제

다른 데이터 저장소에서 데이터를 가져오는 예제

 a. Facade (정면) 역할

  -  시스템을 구성하고 있는 많은 역할에 대해 단순한 창구가 된다.

  -  최상위 레벨에서 단순한 인터페이스를 제공한다. 예제에서는 process 이다.

public class Facade {

    public static String process(Type type,int ...keyArray){
        MapData mapData = new MapData();
        PropertiesData propertiesData = new PropertiesData();
        switch(type){
            case MAP:
                return mapData.getData(keyArray);
            case PROPERTIES:
                return propertiesData.getData(keyArray);
            default:
                return null;
        }
    }
}

 b. 요소들

  -  시스템을 구성하는 다른 요소들(클래스)은 각각의 임무를 실행하지만 Facade에 대해서는 신경쓰지 않는다.

  -  Facade 역할으로부터 호출 되어지지만 반대로 Facade를 호출하는일은 없다.

public class MapData {

    Map<Integer,String> store = new WeakHashMap<>();
    {
        store.put(1,"YOU");
        store.put(2,"WILL");
        store.put(3,"B");
        store.put(4,"FINE");
        store.put(5,"BLOG");
    }

    public String getData(int ...keyArray){
        StringBuilder sb = new StringBuilder();
        for(int key:keyArray){
            sb.append(store.get(key)).append(" ");
        }
        return sb.toString();
    }

}

public class PropertiesData {

    public String getData(int ...keyArray){
        Properties properties = new Properties();
        StringBuilder sb = new StringBuilder();

        try {
            properties.load(new FileReader("resources/store.properties"));
            for (int key:keyArray) {
                sb.append(properties.getProperty(String.valueOf(key))).append(" ");
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
        return sb.toString();
    }

}
/** store.properties
1=you
2=will
3=b
4=fine
5=blog
*/

 e. Main (Client) 역할

  -  Facade 패턴을 쓰지 않는 경우를 보면 모든 요소에 대한 의존성을 가져야한다.

      => 예제로는 두개밖에 안만들었지만 엄청 복잡할경우 거대해질것이라는 것을 예상할 수 있다.

public class Main {

    public static void main(String[] args) {

        // normal
        MapData mapData = new MapData();
        PropertiesData propertiesData = new PropertiesData();
        System.out.println(mapData.getData(1,2,3,4,5));
        System.out.println(propertiesData.getData(1,2,3,4,5));

        // facade
        System.out.println(Facade.process(Type.MAP,1,2,3,4,5));
        System.out.println(Facade.process(Type.PROPERTIES,1,2,3,4,5));
    }
}

  

다. 정리

 a. Facade 역할은 무엇?

  -  퍼사드 패턴은 복잡한 것을 단순하게 보여준다. 복잡한 것은 내부의 많은 클래스 관계나 사용법을 의미한다.

       => 이 복잡한 것을 의식하지 않도록 해준다.

  -  핵심은 인터페이스를 적게 하는 일!!

       => 적다는 것은 외부와의 결합이 소원

   

 b. 재귀적인 Facade 패턴의 적용 

  -  Facade 역할을 가진 클래스의 집합이 여러개가 있을경우 이 집합을 정리해서 새로운 Facade역할을 도입도 가능

  -  큰시스템이 다수의 클래스, 패키지를 포함하고 있을때 요소요소에 Facade 패턴을 적용하면 보다 편리해진다.

Facade 패턴은 연관된 클래스들을 모아서 최소한의 인터페이스를 제공하는 창구 패턴이다.
반응형

블로그의 정보

57개월 BackEnd

BFine

활동하기