브리지 패턴 구현과 더불어 추상화 부분까지 변경해야 한다면 유용한 패턴 추상화된 부분과 구현 부분을 서로 다른 클래스 계층 구조로 분리해서 그 둘을 모두 변경할 수 있다. 브리지로 연결함으로써 양 쪽을 서로 독립적으로 변경해줄 수 있게 되었다. 브리지 패턴의 장점 구현과 인터페이스를 완전히 결합하지 않았기에 구현과 추상화 부분을 분리 가능 추상화된 부분과 실제 구현 부분을 독립적으로 확장 가능 추상화 부분을 구현한 구상 클래스가 바뀌어도 클라이언트에는 영향 X 브리지 패턴의 활용법과 단점 여러 플랫폼에서 사용해야 하는 그래픽스와 윈도우 처리 시스템에서 유용하게 쓰임 인터페이스와 실제 구현할 부분을 서로 다른 방식으로 변경해야 할 때 유용하게 쓰임 디자인이 복잡해진다는 단점 빌더 패턴 제품을 여러 단계로 ..
디자인 패턴의 정의 패턴(Pattern)은 특정 컨텍스트 내에서 주어진 문제의 해결책이다. 컨텍스트(context): 패턴이 적용되는, 반복적으로 일어날 수 있는 상황 문제(problem): 컨텍스트 내의 제약조건과 이뤄야 하는 목표 해결책(solution): 제약조건 속에서 누가 적용해도 목표를 이룰 수 있는 일반적인 디자인 어떤 컨텍스트 내에서 일련의 제약조건에 의해 영향을 받는 문제가 발생했다면, 그 제약조건 내에서 목적 달성을 위한 해결책이 되는 디자인을 적용하면 된다. 패턴을 정의할 수 있어야 패턴 카탈로그를 만들 수 있다. → 패턴은 반복적으로 등장하는 문제에 적용할 수 있어야 하며, 이름을 가지고 있어야 한다. 패턴 카탈로그 GoF(Gang of Four)의 디자인 패턴에서 처음 등장했으며,..
복합 패턴 반복적으로 생길 수 있는 일반적이 문제를 해결하는 용도로 2개 이상의 패턴을 결합해서 사용하는 것 단순히 여러 패턴을 섞어 쓴다고 해서 복합 패턴인 것은 아님 예시 1: 오리 만들기 오리 예시에 거위 추가 + 꽥꽥 소리 횟수 측정 + 오리 무리 단위로 관리 + 꽥꽥 소리 나면 연락받기 각 오리 객체(Quackable + QuackObservable) 별로 자신의 행위를 관찰할 Observer 를 저장할 수 있는 Observable( + QuackObservable) 을 저장하고 있음 이후 QuackObservable 의 메서드인 RegisterObserver 로 관찰자를 Observer 에 등록하고, 특정 행위를 수행할 때 NotifyObservers 를 호출하여 등록된 관찰자들 모두에게 알려..
특정 객체로의 접근을 제어하는 대리인(특정 객체를 대변하는 객체)를 제공 구성요소 Subject RealSubject와 Proxy의 인터페이스를 제공 두 객체가 동일한 인터페이스를 구현해서 RealSubject가 들어갈 자리에 Proxy도 들어갈 수 있다. RealSubject 실제로 작업을 처리하는 객체 Proxy RealSubject의 대변인 역할을 하며 해당 객체로의 접근을 제어 RealSubject의 레퍼런스가 들어있으며, 인스턴스를 생성하거나 제거하는 역할도 수행함 책에 소개된 종류 원격 프록시: 원격 객체로의 접근을 제공 가상 프록시: 생성하기 힘든 자원으로의 접근을 제공 (e.g 생성 비용이 비싼 객체) 보호 프록시: 접근 권한이 필요한 자원으로의 접근을 제어 그 외 다양한 프록시 패턴의 변..
상황 예시: 뽑기 기계 만들기 public class GumballMachine { 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_OUT; // 현재 상태 초기화 int count = 0; public GumballMachine(int count) { this.count = count; if (count > 0) { state = NO_QUARTER; } } public void insertQuarter() { if (state == HAS_QUARTER) { System.out.pr..
반복자 패턴 상황 예시: 아침 메뉴와 점심 메뉴 합병 아침 메뉴 : List breakfastItems 점심 메뉴 : MenuItem[] lunchItems 아침 메뉴와 점심 메뉴를 모두 출력하고 싶은 상황 for (int i = 0; i < breakfastItems.size(); i++) { MenuItem item = breakfastItems.get(i); System.out.println(item.getName()); } for (int i = 0; i < lunchItems.length; i++) { MenuItem item = breakfastItems[i]; System.out.println(item.getName()); } 각 메뉴는 서로 다른 구현 방식을 사용하고 있으므로, 2개의 서로..