Computer Sciences/Design Patterns(19)
-
13. Bridge Pattern
문제 TV를 작동시키는 리모컨은 여러 제조사가 있다. 그래서 TV를 모든 리모컨으로 동작시키기 위해서는 리모컨을 인터페이스화 하고 TV를 컴포지션하여 사용할 수 있었다. 그런데 이젠 TV 제조사가 많아졌다. 기존에는 삼성이 모든 TV를 만들었지만 이젠 LG도 TV를 생산한다고 한다. 이를 어떻게 풀어야 할까? 해결 방안 이 문제를 해결하는 방법은 간단하다. 리모컨에서 한 것처럼 TV도 인터페이스화하고 리모컨에서는 TV 인터페이스를 컴포지션하면 된다. 클래스 다이어그램으로 나타내면 다음과 같다. 그리고 RemoteControl과 TV의 관계를 브릿지 관계라고 한다. Java 코드로 구현하면 다음과 같다. public class Client { public static void main(String[] ar..
2021.11.14 -
12. State Pattern
문제 한 뽑기 기계가 있다. 이 뽑기 기계는 다음 상태 다이어그램으로 동작한다. 이 다이어그램을 바탕으로 뽑기 기계를 코드로 구현해보자. 먼저 상태를 살펴보자. 동전이 없는 상태, 있는 상태, 캡슐이 판매된 상태, 매진된 상태가 있다. 이를 클래스 변수로 만들면 다음과 같다. final static int SOLD_OUT = 0; // 캡슐매진 final static int NO_QUARTER = 1; // 동전없음 final static int HAS_QUARTER = 2; // 동전있음 final static int SOLD = 3; // 캡슐판매 int state = SOLD; // 현재 상태를 저장하기 위한 변수 동전이 투입, 반환되고 있는 상태에서 손잡이를 돌리면 캡슐이 나간다. // 동전을 투..
2021.10.15 -
11. Composite Pattern
문제 이터레이터 패턴에서 사용한 예시를 다시 써보자. 두 가게를 합병한 후로 장사가 탄탄대로를 달려서 이젠 점심 메뉴에 디저트 메뉴도 넣자는 기획이 들어왔다. 즉 점심 메뉴 안에 디저트 메뉴가 포함되는 것이다. 이러한 구조는 어떤 자료구조를 사용해야 할까? 메뉴 안에 메뉴... 트리 구조가 적당할 것 같다. 그림을 그려보면 대충 다음과 같다. 기존의 이터레이터 패턴을 유지하면서 모든 메뉴를 순회하도록 변경할 수 있을까? 정답부터 말하자면 그렇다. 컴포지트 패턴을 적용하면 이를 해결할 수 있다. 컴포지트 패턴 객체들을 트리 구조로 구성하여 부분과 전체를 나타내는 계층 구조로 만드는 패턴이다. 이 패턴을 이용하면 클라이언트에서 개별 객체와 다른 객체들로 구성된 복합 객체를 똑같은 방법으로 다룰 수 있다. 이..
2021.10.15 -
10. Iterator Pattern
문제 우리는 프로그래밍을 하면서 여러 자료구조를 사용한다. 간단하게는 배열부터 연결 리스트, 힙, 트리도 사용하기도 한다. 그런데 이런 자료구조에 저장한 데이터를 모두 접근하고 싶다면 어떻게 할까? 모든 자료구조마다 for 문을 돌리면서 탐색해야 할까? 또 자료구조마다 탐색 방법도 다른데 어떻게 해야 될까? 이러한 문제를 이터레이터 패턴으로 해결할 수 있다. 우리는 팬케이크 가게를 운영한다. 우리는 ArrayList를 사용해서 메뉴를 관리한다. 그런데 사업이 잘 되어 다른 가게와 합병하게 되었다. 그런데 이 가게는 배열로 메뉴를 관리하고 있었다. 그래서 기존에 우리가 메뉴를 접근할 때 사용하던 방식과 달라 혼란이 발생했다. public class MenuItem { String name; String d..
2021.10.15 -
9. Template Method Pattern
문제 어느 카페에서는 커피와 홍차를 판매한다. 이 둘의 공통점은 무엇일까? 카페인이 들어간다는 것이다. 각각을 만드는 법은 다음과 같다. 커피 만드는 법 물을 끓인다. 끓는 물에 커피를 우려낸다. 커피를 컵에 따른다. 설탕과 우유를 추가한다. 홍차 만드는 법 물을 끓인다. 끓는 물에 차를 우려낸다. 차를 컵에 따른다. 레몬을 추가한다. 이를 각각 클래스로 작성하면 아래와 같다. public class Coffee { void prepareRecipe() { boilWater(); brewCoffeeGrinds(); pourInCup(); addSugarAndMilk(); } public void boilWater() { System.out.println("물 끓이는 중"); } public void br..
2021.10.14 -
8. Facade Pattern
문제 요즘 혼자 사는 사람들이 참 많아졌다. 사회적으로 불안한 요소가 많아져서 그런 듯 싶다. 나는 나중에 자취를 하게 되면 소원이 하나 있다. 바로 빔 프로젝터를 사서 집을 영화관처럼 만드는 것이다. 이를 외국에서는 홈 씨어터(Home Theater)라고 부른다. 이를 위해 여러 장비를 알아본 결과 다음과 같았다. 앰프 튜너 CD 플레이어 DVD 플레이어 프로젝터 스크린 팝콘기계 영화조명 이것들을 조합하여 세팅하는 것도 복잡하다. 아래는 이 장비들을 연결시킨 클래스 다이어그램이다. 보기만 해도 어지럽다. 이대로 영화를 보기 위해 순서대로 알고리즘을 짠다면 다음과 같을 것이다. 팝콘 기계를 켠다. 팝콘을 튀기기 시작한다. 전등을 어둡게 조절한다. 스크린을 내린다. 프로젝터를 켠다. 프로젝터로 DVD 신호..
2021.10.14