본문 바로가기

소프트웨어/디자인패턴

(16)
[소프트웨어/디자인패턴] 중개자 패턴(Mediator Pattern) 여러 객체간의 협업관계를 중앙화하는 패턴 Context GUI 개발을 하다 보면 여러 컴포넌트 간의 호출 관계를 그릴 수 있습니다. 우리가 많이 개발하는 UI 중 하나인 로그인 폼을 예로 들어보겠습니다. 사용자의 이름과 암호, Guest로 로그인, 로그인 버튼, 취소 버튼이 있다고 생각해봅시다. 그럼 대략 아래와 같은 기획과 요구사항이 나올 수 있습니다. 요구사항 Guest로 로그인이 체크된 경우 Username과 Password는 비활성화 Login 버튼 활성화 Guest로 로그인이 체크가 되지않은 경우 Username은 활성화 Password는 Username에 한 글자라도 텍스트가 입력된 경우 활성화 Username과 Password 모두 내용이 있는 경우에만 Login버튼 활성화 Problem G..
[소프트웨어/디자인패턴] 메멘토 패턴(Memento Pattern) Memento Pattern 캡슐화를 위배하지 않은 채 내부 상태의 스냅샷을 찍는 패턴 Context 어떤 스토리가 있는 RPG게임을 생각해봅시다. 사용자는 모험가를 통해 게임을 플레이할 것이며 각 단계의 스테이지를 깨나가면서 캐릭터는 성장하게 될 것입니다. 몬스터들을 처치하면서 아이템도 오를 것이고 HP와 MP도 사용할 것입니다. 그리고 모험가는 맵을 모험하면서 위치도 계속해서 변경되겠죠. 아마 예상을 하자면 아래와 같은 다이어그램이 나오지 않을까 싶습니다. Problem 하지만 유저는 항상 모든 맵을 처음 모험하다보니 더 어려운 상대를 만나서 다치기도 하고 죽기도할 것입니다. 하지만 RPG게임이 실제 인생과 같이 모든 것을 잃고 다시 시작한다면 게임플레이어는 아마 이 게임에 대해서 욕을 할지도 모릅니..
[소프트웨어/디자인패턴] 방문자 패턴(Visitor Pattern) Visitor Pattern 방문자 패턴은 데이터 구조와 처리를 분리하는 패턴입니다. Context 우선 방문자 패턴이 무엇인지 보다는 어떤 때에 사용하는 것이 좋은지에 대해서 알아봅시다. 흔히 접할 수 있는 구문트리, 아래와 같은 파일시스템, 혹은 계층적 구조로 형성되는 데이터를 처리 할때에는 각각의 노드 클래스에 처리와 관련된 로직을 구현하는 것이 일반적인 방법입니다.위 이미지는 File과 Directory클래스로 파일 시스템을 표현한 다이어그램입니다. 메서드로는 OutputList라는 재귀적으로 파일 리스트를 출력하는 로직을 가지고 있습니다. 이를 호출하게 되면 리눅스의 ls -R처럼 하위에 있는 모든 파일 리스트를 출력하게 됩니다. public abstract class Entry { public..
[소프트웨어/디자인패턴] 추상 팩토리 패턴 (Abstract Factory Pattern) Abstract Factory Pattern Context 스마트폰을 조립하는 공장을 생각해보면 아래와 같은 모델이 어느정도 연상될 것이다.기본적으로 AP, Battery는 스마트폰을 구성하는 중요한 요소이며 갤럭시는 SamsungExynos와 SamsungBattery를, 애플의 아이폰은 AppleAX와 LG 배터리를 사용한다. 그리고 이들의 인스턴스는 각각의 팩토리에서 생산된다. 어느 제품에 대한 배터리나 AP를 생산하는지는 Vender Enum를 인자로써 제공한다. 아래는 위 모델의 코드 구현이다. abstract class AP { private Battery battery; public AP(Battery battery) { this.battery = battery; } public void p..
[소프트웨어/디자인패턴] 컴포지트 패턴 (Composite Pattern) 컴포지트 패턴은 동일 기능을 수행하는 부분-전체 관계를 정의할 때 유용하다. Context 보통 컴퓨터의 가격과 전력을 산정할 때는 중요하다. 어떤 CPU와 어떤 램 그리고 그래픽카드를 장착했는지에 따라 컴퓨터의 가격과 소비전력을 천차만별이다.흔히 우리는 기존에 배운대로 설계하여 코드를 작성할 것이다. 일부 눈엣가시인 듯한 코드들이 보이지만 가볍게 무시하자. class Computer { private CPU cpu; private Ram ram; private HardDisk disk; public Computer(CPU cpu, Ram ram, HardDisk disk) { this.cpu = cpu; this.ram = ram; this.disk = disk; } public int getPrice..
[소프트웨어/디자인패턴] 퍼사드 패턴 (Facade Pattern) 컴퓨터의 전원버튼을 누를때 우린 어떻게 동작하는지 생각하지 않는다. 글을 작성하려고 준비하면서 느낀점은 "과연 이 게시글을 볼까?"였다. 너무 쉬웠기떄문이다. 복잡한 프로세스의 내용을 하나의 인터페이스 메서드로 간략화하여 사용하는 패턴으로 정리할 수 있다. Context 주인공은 쉬는 동안에 영화를 보고싶다. 집에 DVDPlayer와 Screen이 있어 이를 사용하여 영화관에 가지 않고도 충분히 좋은 환경으로 영화를 즐긴다. 주인공이 쉴때 영화를 보려면 screen.on() -> dvdPlayer.insert()순으로 스크린을 켜고 볼 영화의 DVD를 플레이어에 넣어야한다. 이와 같은 내용을 코드드로 나타내면 아래와 같다. class Screen { public void on() { System.out...
[소프트웨어/디자인패턴] 어댑터 패턴 (Adapter Pattern) 어댑터 패턴은 아무 관련없는 인터페이스간의 호환성을 도와준다. Context 사실 adapter는 일상생활에서도 많이 볼 수 있는 형식과 같다. 흔히 말하는 돼지코와 같은 원리이다. 먼저 아래와 같은 상황이 주어진다고 해보자, 최초 어플리케이션 설계시 Client는 Car을 가지고 있으며 움직일 때마다 car::depart메서드를 이용한다. 이를 코드로 나타내면 아래와 같다. interface Car { void move(); } class Sonata implements Car { @Override public void move() { System.out.println("Sonata is going!"); } } class Client { private Car car; public Client(Car ..
[소프트웨어/디자인패턴] 팩토리 메서드 패턴(Factory Method Pattern) 팩토리 메서드 패턴은 인스턴스 생성 정책을 사용 클래스로부터 분리한다. Context 엘리베이터 내부에는 어디로 갈 것인지에 대한 컨트롤러가 있고, 빌딩의 각 층에는 엘리베이터를 방향에 따른 엘리베이터를 호출하는 버튼이 있다. 이때, 어느 엘리베이터를 해당 층에 보낼 것 정하는 것을 스케줄링이라한다. 보통의 경우에는 엘리베이터가 사람을 많이 이동시키려고 처리량에 따른 스케줄링 정책을 가지고 있기 마련이다. ElevatorManager은 많은 엘리베이터를 거느리고 있으며, 스케줄링에 대해 처리량에 따른 정책을 가지고 있는 TroughputSceduler룰 속성으로 가지고 있다. 각 층에서 요청이 오면 ElevatorManager::requestElevator를 통해 ThroughputScheduler에 요..