Java/Design Pattern 20

[헤드퍼스트 디자인 패턴] 12-6. 비지터 패턴

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다 1. 비지터 패턴다양한 객체에 새로운 기능을 추가할 경우 구성요소Visitor새로운 기능을 추가하는 객체각 객체의 accept 메소드를 호출하여 자신을 전달 ConcreteVisitor각 Element에 대해 수행할 작업 정의 Elementaccept() 메서드를 정의한 객체자신이 받아들일 수 있는 비지터를 정의 장점객체의 구조를 변경하지 않음새로운 기능 추가 용이비지터만 추가하면 됨 2. MenuMenuComponent// 메뉴 항목을 나타내는 요소 클래스public abstract class MenuComponent { public abstract void accept(MenuVisitor visitor);} Menupubl..

Java/Design Pattern 2024.12.19

[헤드퍼스트 디자인 패턴] 12-5. 프로토타입 패턴

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다1. 프로토타입 패턴어떤 객체의 인스턴스를 만들 때 자원이 많이 들거나 복잡할 경우 장점성능기존 인스턴스를 복사 (생성 X)클라이언트 코드에서 어떤 클래스의 인스턴스를 만드는지 모름 2. GameMonster// Prototype 인터페이스public interface Monster extends Cloneable { Monster clone(); void display(); // 몬스터의 모양을 화면에 표시}// 기본 몬스터 클래스public class DefaultMonster implements Monster { private String shape; // 몬스터의 모양 private String color;..

Java/Design Pattern 2024.12.19

[헤드퍼스트 디자인 패턴] 12-4. 플라이웨이트 패턴

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다1. 플라이웨이트 패턴객체를 최대한 재사용하여 메모리를 절약하는 디자인 패턴인스턴스 하나로 여러 개의 가상 인스턴스를 제공하고 싶을 경우 구성 요소Intrinsic State여러 객체 간에 공유되는 상태불변 Extrinsic State공유되지 않고 개별 객체에 따라 달라지는 상태호출 시 클라이언트가 전달 2. TreeManagerimport java.util.ArrayList;import java.util.List;public class TreeManager { private final List trees = new ArrayList(); // 나무 추가 (외재적 상태를 포함한 TreeLocation 객체 생성) pub..

Java/Design Pattern 2024.12.19

[헤드퍼스트 디자인 패턴] 12-3. 책임 연쇄 패턴

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다1. 책임 연쇄 패턴1개의 요청을 2개 이상의 객체에서 처리해야 할 경우 사용되는 패턴 객체 사슬순차적으로 요청을 처리함자신이 처리할 수 있는 요청만 처리나머지는 다음 객체에 위임 장점요청을 보낸 쪽과 받는 쪽을 분리할 수 있음사슬을 동적으로 수정할 수 있음 2. RemoteControlpublic class RemoteControl { private Handler handlerChain; public void setHandlerChain(Handler handlerChain) { this.handlerChain = handlerChain; } public void pressButton(String r..

Java/Design Pattern 2024.12.19

[헤드퍼스트 디자인 패턴] 12-2. 빌더 패턴

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다 1. 빌더 패턴제품의 생산 단계를 캡슐화하여 여러 단계로 나눠서 만들도록 하는 패턴클라이언트는 추상 인터페이스로 제품을 단계적으로 생산 장점유연한 디자인이 필요할 경우여러 조합이 발생할 수 있음생성자가 너무 많아짐명확하게 객체를 생성할 수 있음제품의 내부 구조를 클라이언트로부터 보호할 수 있음 2. VacationVacationBuilderpublic class Vacation { private String date; private String destination; private String accommodation; private List activities; // Private constructor ..

Java/Design Pattern 2024.12.19

[헤드퍼스트 디자인 패턴] 12-1. 브리지 패턴

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다1. 브리지 패턴추상 계층과 구현 계층을 독립적으로 확장할 수 있도록 다리를 두는 디자인 패턴서로 독립적으로 변경 가능한 두 계층을 분리함구현 뿐 아니라 추상화도 변경해야 하는 경우 사용 장점추상화와 구현을 각각 독립적으로 확장 가능조합 폭팔 방지기존 코드 변경 최소화 2. 예제: RemoteControlRemoteControl (Bridge)더보기abstract class RemoteControl { protected TV tv; // Bridge to TV public RemoteControl(TV tv) { this.tv = tv; } public abstract void turnOn(); ..

Java/Design Pattern 2024.12.18

[헤드퍼스트 디자인 패턴] 11. 프록시 패턴

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다 1. 프록시 패턴다른 객체에 대한 접근을 제어하기 위해 그 객체의 대리인을 사용하는 디자인패턴원래 객체에 직접 접근하는 것이 아닌, 프록시를 통해 간접적으로 접근하도록 함 구성 요소구성 요소설명Subject(인터페이스)원래 객체와 프록시가 공통으로 구현하는 인터페이스RealSubject실제 작업을 수행하는 객체ProxyRealSubject에 대한 접근을 제어하는 대리 객체 사용처목적설명접근 제어보안, 인증, 권한 제어를 위해 직접 접근 대신 프록시에서 제어함지연 초기화무거운 객체의 생성/로딩을 실제 필요 시점까지 미루기 위해 사용원격 호출네트워크나 다른 JVM에 있는 객체와 통신하기 위한 로컬 대리 객체 제공부가 기능 추가성능 측정,..

Java/Design Pattern 2024.12.18

[헤드퍼스트 디자인 패턴] 10. 상태 패턴

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다1. 상태 기계상태에 따라 시스템의 행동이 달라지고, 상태 전이는 명확하게 정의된 규칙에 따라 일어남구성 요소설명상태 모음시스템이 가질 수 있는 여러 상태들을 정의함 (Idle, Running, Paused, Finished 등)상태 표현 변수현재 상태를 나타내는 인스턴스 변수 (State currentState;) 등행동 모음상태에 따라 달라지는 행동들을 정의함 (start(), pause(), reset() 등) 예제: GumballMachine만약 상태가 추가될 경우, 상태에 의존하는 모든 코드들에 분기 코드가 추가되어야 함 예제) GumballMachine더보기public class GumballMachine { final..

Java/Design Pattern 2024.12.18

[헤드퍼스트 디자인 패턴] 9-2. 컴포지트 패턴

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다 1. 컴포지트 패턴객체를 트리구조로 구성해서 부분-전체 계층구조를 구현한 패턴리프와 컴포지트 객체를 동일한 인터페이스로 다룰 수 있음 장점장점설명일관된 처리 방식개별 객체와 복합 객체를 같은 방식으로 다룰 수 있음 (e.g., draw(), getPrice() 등)투명성 확보클라이언트는 리프인지 컴포지트인지 신경 쓰지 않고 동일한 방식으로 호출 가능확장성 높음새로운 리프나 복합 객체를 손쉽게 추가 가능 → 구조 변경이 쉬움 단점단점설명단일 책임 원칙 위반컴포지트 객체가 계층 관리 + 데이터 보관까지 함께 담당하게 됨불필요한 메서드 강제리프 노드에도 필요 없는 메서드를 구현해야 할 수 있음 → 인터페이스 오염 2. 예제: MenuCom..

Java/Design Pattern 2024.12.18

[헤드퍼스트 디자인 패턴] 9-1. 반복자 패턴

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다 1. 반복자 패턴컬렉션 내부의 구조를 노출하지 않고, 집합체 내부 요소들을 순차적으로 접근할 수 있는 방법 제공클라이언트는 인터페이스만 알고 있으면 됨 (접근 코드의 형태를 통일할 수 있음) 2. 예시: Iterator반복을 캡슐화하기 예시) 캡슐화 전더보기for (int i = 0; i 예시) 캡슐화 후 (Iterator)더보기Iterator iterator = breakfastMenu.createIterator();while (iterator.hasNext()) { MenuItem menuItem = iterator.next();}

Java/Design Pattern 2024.12.18