Java Design Pattern(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 -
8. Facade Pattern
문제 요즘 혼자 사는 사람들이 참 많아졌다. 사회적으로 불안한 요소가 많아져서 그런 듯 싶다. 나는 나중에 자취를 하게 되면 소원이 하나 있다. 바로 빔 프로젝터를 사서 집을 영화관처럼 만드는 것이다. 이를 외국에서는 홈 씨어터(Home Theater)라고 부른다. 이를 위해 여러 장비를 알아본 결과 다음과 같았다. 앰프 튜너 CD 플레이어 DVD 플레이어 프로젝터 스크린 팝콘기계 영화조명 이것들을 조합하여 세팅하는 것도 복잡하다. 아래는 이 장비들을 연결시킨 클래스 다이어그램이다. 보기만 해도 어지럽다. 이대로 영화를 보기 위해 순서대로 알고리즘을 짠다면 다음과 같을 것이다. 팝콘 기계를 켠다. 팝콘을 튀기기 시작한다. 전등을 어둡게 조절한다. 스크린을 내린다. 프로젝터를 켠다. 프로젝터로 DVD 신호..
2021.10.14 -
7. Adapter Pattern
문제 어댑터는 우리 주위에서 흔하게 볼수 있는 것이다. 110V를 220V로 변환해야 하는 경우가 대표적이다. 우리나라는 220V를 쓰는데 유럽 같은 경우 110V를 쓴다. 그래서 우리가 만약 외국 여행을 가는데 충전기를 사용하려면 어댑터를 갖고 가서 110V를 220V로 바꿔줘야 한다. 프로그래밍에서도 이런 경우가 발생한다. 우리가 운영하던 시스템이 있는데 외부 업체에서 인터페이스를 제공해주었다. 그런데 우리 시스템과 연결이 되지 않는 경우 어떻게 해야 할까? 여기서 어댑터를 사용할 수 있다. 오리와 칠면조 우리는 오리와 칠면조 객체를 가지고 있다. public class MallardDuck implements Duck { @Override public void quack() { System.out...
2021.10.14 -
6. Command Pattern
문제 지수는 친구로부터 특별한 선물을 받았다. 그건 리모컨인데 내가 명령을 입력하면 이를 동작 시켜주는 특별한 리모컨이다. 그래서 집에서 사용하는 여러 가전제품을 사용하려고 명령을 등록하려고 하는데 문제가 생겼다. 각각의 가전제품에서 명령을 실행하는 방법이 달랐던 것이다. 전등은 켜고 끌 때 on(), off()로 수행되고 선풍기는 high(), medium(), low(), off()와 같이 단계 별로 바람 세기를 조절할 수 있게 되어있다. 그 외에 TV, 냉장고 등 많은 가전제품이 서로 다르게 구현되어 있다. 이 문제를 어떻게 해결해야 할까? 해결 방안 여러 객체의 행위를 통일하고 싶을 때 우리는 인터페이스를 사용했다. 이번에도 인터페이스를 만들어야 겠다. 그렇다면 어떻게 만들까? 일단 리모컨에서는 ..
2021.10.14