본 게시글은 '헤드퍼스트-디자인 패턴 (개정판)'을 기준으로 작성된 글입니다. 문제점 찾아보기 Duck duck; if (picnic) { duck = new MallardDuck(); } else if (hunting){ duck = new DecoyDuck(); } else if (inBathTub) { duck = new RubberDuck(); } 다음 코드에서의 문제점은, 각 조건에 따라 다른 Duck이 생성이 된다. 만약 새로운 Duck을 추가하기 위해 확장한다면, 어떤 것을 추가하고 삭제해야할 지 코드를 다시 확인해야 한다. 결론 Concrete Class(구상 클래스)를 많이 사용하면, 새로운 구상 클래스가 추가될 때마다 코드를 고쳐야하므로 많은 문제가 생길 수 있다. 결국 변화에 닫혀 있..
본 게시글은 '헤드퍼스트-디자인 패턴 (개정판)'을 기준으로 작성된 글입니다. 데코레이터 패턴이란? 객체의 추가 요소를 동작으로 더할 수 있다. 데코레이터를 사용하면, 서브클래스를 만들 때 보다 훨씬 유연하게 기능을 확장할 수 있다. 가정 - 카페 카페의 음료 주문 시스템을 구현하는 상황을 가정해보자. 가정 1 카페에는 아이스티도 있고, 카페모카도 있고, 아이스 아메리카노 등 여러가지 음료가 있다. 공통적으로 가지고 있는 '음료'라는 성질을 가지고 있는 클래스를 만들고, 이것을 상속받아 각 음료를 구현하였다. 가정 1의 문제 만약에 새로운 손님이 와서 '휘핑도 추가해주시고, 여기 샷도 추가해주세요' 와 같은 새로운 요구사항이 담긴 주문을 하게 된다면, 어떻게 될까? 다음 그림과 같이 매우 복잡한 결과가 ..
본 게시글은 '헤드퍼스트-디자인 패턴 (개정판)'을 기준으로 작성된 글입니다. 옵저버 패턴이란? 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에게 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다 의존성을 정의한다. 간단하게 말하면, 신문사와 구독자가 있을 때, 신문사를 주제 / 구독자를 옵저버라고 부른다. 주제 객체는 주제에서 중요한 데이터를 관리하고, 옵저버 객체의 경우에는 주제를 구독하며, 주제의 데이터가 바뀔 때 마다 갱신 내용을 전달 받는다. 핵심은 1대다 이다. 어떤 객체가 변화할 때 이와 연관된 여러 객체에게 직접 통보하지 않고, 중간 관리자(옵저버)를 두어 변화의 감지와 통보를 대신하게 한다 옵저버 패턴은 다양한 방식으로 구현할 수 있다. 보통은 주제 인터페이스와 옵저버 인터페..
본 게시글은 '헤드퍼스트-디자인 패턴 (개정판)'을 기준으로 작성된 글입니다. 전략 패턴이란? 전략 패턴이란 알고리즘군을 정의하고 캡슐화해서 각각의 알고리즘군을 수정해서 쓸 수 있게 해준다. 전략 패턴을 사용하면 클라이언트로부터 알고리즘을 분리해서 독립적으로 변경할 수 있다. 왜 사용할까? 예를들어 오리 시뮬레이션 게임을 제작한다고 가정해보자. 먼저 Duck 이라는 슈퍼 클래스를 만들고, 클래스를 확장하여 다른 종류의 오리들을 만들었다고 가정해보자. 만약 fly() 기능을 추가해달라고 한다면? 기존의 Duck 클래스에 fly()를 추가해주고, 각 서브클래스에서 fly()를 상속받게 해준다. 날면 안되는 오리가 있다면? 날면 오리가 안되는 오리가 있다면, 수퍼 클래스에 fly()를 추가하는 행동으로 날면 ..