프로그래밍/Design Pattern

Design Pattern을 공부해보자 1탄

seungdols 2016. 8. 30. 17:27

Design Pattern을 공부해보자

Strategy Pattern

전략 패턴은 쉽게 말해 확장성을 위하여 관심을 분리 시키는 것인데, 관심 분리를 하는 초점이 바로 객체의 행동이다.

객체의 다양한 행동을 위해 분리를 하는데 전제 조건은 특정 객체는 하는데 다른 객체는 그 행동이 필요하지 않을 수 있다.

고로, 객체마다 달라지는 부분과 달라지지 않은 부분을 분리 시키고 해당 코드들을 특정 으로 모으는 것이다. 그래서 내가 필요로 할 때 추상화 된 기능을 구현하고, 실제 사용하는 측에서는 구현한 클래스에게 해당 기능을 위임 시키는 형태로 만든다.

그래서 내가 어떤 전략을 취하느냐에 따라 해당 객체가 특정 기능을 사용할지 말지 또한 결정 할 수 있게 된다.

전략 패턴 - code

Observer 패턴


옵저버 패턴은 신문사와 구독자로 쉽게 비유 할 수 있다.
단순하게 신문사는 구독자 리스트를 가지고 있으며, 해당 주소로 매일 신문을 보낸다.

즉, 2가지 업무

  1. 구독자 리스트 관리

  2. 신문 배달

구독자는 신문사에 특정 요청을 할 수 있다.

  1. 구독 등록

  2. 구독 해지

구독 해지를 하기 전, 구독 등록을 하기 전에는 신문사로부터 신문을 받을 수 없다.

즉, 업데이트 된 신문을 받고자 하면, 구독자는 신문사에 구독 등록을 해야한다.

구독 등록을 하게 되면, 신문사의 관리 영역에 들어가게 되는데 이를 Observer Zone이라고 생각하자. (내가 이해한 대로 만든 용어)

옵저버 영역 안에 있는 구독자들만 매일 새로운 신문을 받을 수 있다.

즉, 변화하는 정보(데이터)를 즉각적으로 받을 수 있는 것이다. 정보를 받는 방식에는 Push 방식 / Pull 방식 2가지가 존재한다.

옵저버 패턴을 사용하는 이유는 업데이트 된 정보를 다수의 옵저버 존에 속해 있는 구독자들에게 자동적으로 전송을 한다.

그러므로 각기 다른 구독자마다 정보를 갱신 하는 것이 아니니 중복된 코드를 줄이고, 일관된 정보를 지속적으로 업데이트 받을 수 있는 이점이 있다.

OCP(OPEN - CLOSED PRICIPLE)

클래스는 확장에 대해서는 열려 있어야 하나, 코드 변경에 있어서는 닫혀있어야 한다.

옵저버 패턴 코드

Decorator Pattern




데코레이터 패턴은 유사한 객체들 간 추가 되는 것들에 의해서 다른 객체가 될 때 사용 하면 좋을 것 같다고 생각 한다.

코드는 예시로 음료 수퍼 클래스와 첨가물에 해당하는 클래스로 초기 음료 추상 클래스를 구현한 음료 클래스에 첨가물을 계속 감싸는 형태로 확장 시켜 나간다.

Beverage beverage1 = new DarkRoast();//.99

beverage1 =  new Mocha(beverage1);//.20

beverage1 =  new Mocha(beverage1);//.20

beverage1 =  new Whip(beverage1);//.10

System.out.println(beverage1.getDescription() + " $" + beverage1.cost());

즉, DrakRoast 객체에 모카 , 모카, 휘핑 크림이 겹겹이 쌓여 다시 beverage로 반환 된다.

결과적으로 cost를 구하는 형태는 재귀적으로 묘사가 된다. (호출 스택 구조가 완전하게 재귀 형태 = Stack 모양)을 띈다.

이러한 형태는 Java I/O에서도 흔히 볼 수 있다.

FileInputStream < BufferedInputStream < LineNumberInputStream으로 File에서 행 번호를 추가하는 기능까지 추가 할 수 있다.

데코레이터 패턴 코드


반응형