목록Design Patterns (15)
mojo's Blog
※ Creational patterns- 새 연산자를 명시적으로 사용하지 않고 새 객체를 만들 수 있음- 클라이언트 코드를 수정하지 않고도 다양한 객체를 객체화할 수 있음- ex) Factory Method, Abstract Factory, Singleton, Builder, Prototype Factory Method- 상속을 사용하여 객체화할 객체를 결정함 Abstract Factory- 객체 생성을 팩토리 객체에 위임함 Factory Method Pattern Hamburger orderHamburger(String type) { Hamburger hamburger; if (type.equals("cheese")) hamburger = new CheeseHamburger(); ..
Mediator Pattern 목적: 서로 다른 객체 집합이 서로 상호 작용하고 통신하는 방식을 캡슐화하여 느슨한 결합을 허용함사용 시기- 객체 집합 간의 통신은 잘 정의되어 있고 복잡할 때- 너무 많은 관계가 존재하고 공통의 통제점이나 의사소통이 필요할 때 객체 간의 상호 연결을 Mediator로 캡슐화한다.- 통신의 중심지 : Mediator- 동료 간 상호 작용을 조정하고 통제하는 책임을 가지고 있음 클래스 간의 느슨한 결합을 촉진한다.- 서로를 명시적으로 언급하지 못하게 함으로써- Mediator는 일반적으로 관련 GUI 구성 요소를 조정하는데 사용됨 Mediator 들은 거의 재사용할 수 없지만, 의사소통의 흐름을 이해하기 쉽다. ※ Observer v.s. MediatorObserver- o..
State Pattern 목적: 객체 상황을 객체의 동작과 연결하여 객체가 내부 상태에 따라 다른 방식으로 동작할 수 있도록 함사용 시기- 객체의 행동은 객체의 상태에 의해 영향을 받아야 함- 복잡한 조건은 객체 동작을 상태와 연결함- 상태 간 전환은 명시적이여야 함 참고: Eraser: State Diagrams 위와 같은 상태 다이어그램을 코딩해보자 public class Eraser { final static int IDLE = 0; final static int AWAITING_INPUT = 1; final static int IN_PROGRESS = 2; final static int COMPLETE = 3; int state; public Er..
Template Method Pattern 목적: 알고리즘의 프레임워크를 식별하여 클래스를 구현하여 실제 동작을 정의할 수 있도록 함사용 시기- 알고리즘의 단일 추상적 구현이 필요함- 하위 클래스 간에 공통된 동작은 공통 클래스에 국한되어야 함- 부모 클래스는 하위 클래스의 동작을 균일하게 호출할 수 있어야 함- 대부분 또는 모든 하위 클래스는 동작을 구현해야 함 두 클래스를 살펴보도록 한다. ※ Class Philosopherpublic class Philosopher { void prepareEat() { think(); leftHandup(); rightHandup(); eat(); } public void think() { // impl think } public void leftHandu..
Observer Pattern 목적: 시스템 내 다른 객체의 상태 변경을 하나 이상의 객체에 알리기 위함사용 시기- 커뮤니케이션을 위해 느슨한 커플링이 필요함- 하나 이상의 객체에서 상태 변경이 다른 객체에서 동작을 트리거링 필요- 브로드캐스팅 기능이 필요함 ※ Application Overview 현재 상태 디스플레이는 위와 같이 사용자는 몬스터의 체력, 위치 정보를 시각화하여 볼 수 있다.다른 디스플레이는 몬스터의 체력, 위치 정보를 수치화하여 볼 수 있고,또 다른 디스플레이는 몬스터의 체력, 위치 정보를 백분율로 볼 수 있다.MonsterData 객체를 이용하여 어플리케이션을 만들어 위와 같이 3 개의 display 를 업데이트 해야 한다. 몬스터 데이터를 사용하는 요소들은 아래와 같다.- 현재..
Strategy Pattern 목적 : 특정 동작을 수행하기 위해 스왑할 수 있는 캡슐화된 알고리즘 집합을 정의언제 사용할지- 알고리즘의 여러 버전이 필요함- 클래스의 동작은 런타임에 정의되어야 함- 조건문은 복잡하고 유지하기 어려움 ※ 초기 디자인public abstract class Dog { public void bark() { // barking impl } public void walk() { // walking impl } public abstract void display();} 요구사항- 모든 개는 짖어야 함- 모든 개는 같은 길에서 걸어야 함- 모든 개는 각자 소유한 "display" 구현이 필요함 위와 같은 디자인은 괜찮다.하지만 아래와 같은 추가 요구사항을 받았으며, 위 클..