본문 바로가기

디자인 패턴

(14)
프록시 패턴(Proxy Pattern) 프록시 패턴 다른 객체를 대변하는 객체를 만들어서 주 객체에 대한 접근을 제어할 수 있다. Subject Proxy를 구현하기 위해 Interface로 설계되어 있으며 RealSubject와 Proxy는 이를 구현한다. RealSubject 실제 서비스를 하는 주 객체이다. Proxy Client가 Subject에게 접근하면 Proxy에게 접근이 된다. Proxy는 접근을 제어할 수도 있고 추가 설정을 한 후 RealSubject에게 위임하여 RealSubject의 실제 서비스를 실행시킬 수 있다. 예제 Subject public interface Subject { void print(); } Subject는 주 객체와 프록시가 사용할 기능을 정의한다. ​ RealSubject​ public class ..
스테이트 패턴(State Pattern) 스테이트 패턴(상태 패턴) 객체의 내부 상태가 바뀜에 따라서 객체의 행동을 바꿀 수 있다. 마치 객체의 클래스가 바뀌는 것과 같은 결과를 얻을 수 있다. ​ 스테이트 패턴을 사용하지 않았을 때 자판기가 있고 동전을 넣은 후 버튼을 누르면 물병이 나오는 시스템을 구현해본다. public class VendingMachine { final static int NO_COIN = 0; final static int HAS_COIN = 1; final static int SOLD = 2; int state = NO_COIN; public VendingMachine() { } public void insertCoin() { if (state == NO_COIN) { System.out.println("동전을 넣습니..
컴포지트 패턴(Composite Pattern) 컴포지트 패턴 객체들을 트리 구조로 구성하여 부분과 전체를 나타내는 계층구조로 만들 수 있다. 이 패턴을 이용하면 클라이언트에서 개별 객체와 다른 객체들로 구성된 복합 객체를 똑같은 방법으로 다룰 수 있다. 이터레이터 패턴에서 구현한 예제에서 만약 점심, 저녁 메뉴에 디저트 메뉴들을 추가해야 한다고 가정해보자. 이럴 때 컴포지트 패턴을 구현한다면 다른 메뉴들을 추가하더라도 처음부터 구현할 필요 없이 간단하게 구현할 수 있다. Component Component는 Composite와 Leaf의 부모가 되고 해당 두 객체가 가질 수 있는 동작들을 가지고 있다. Composite Composite는 Component를 컬렉션으로 가지고 있다. 즉 자기 자신인 Composite와 Leaf를 가질 수 있는 것이다..
이터레이터 패턴(Iterator Pattern) 이터레이터 패턴 컬렉션 구현 방법을 노출시키지 않으면서도 그 집합체 안에 들어있는 모든 항목에 접근할 수 있게 해주는 방법을 제공해 준다. Clinet는 추상화된 Aggregate와 Interator만 참조하여 원하는 기능을 수행할 수 있다. 예제 가게에서 점심 메뉴는 List로 구현하고 저녁 메뉴는 HashMap으로 구현되어 있다고 하자. 두 메뉴를 한 번에 나타내고 싶다고 하였을 때 이터레이터 패턴을 사용할 수 있다. Aggregate public interface Menu { public Iterator createIterator(); } Iterator를 생성하는 인터페이스가 된다. Iterator는 자바에서 제공하는 API이다. ConcreteAggregate public class MenuIt..
템플릿 메서드 패턴(Template Method Pattern) 템플릿 메서드 패턴 상위 클래스에서는 동작상의 알고리즘의 뼈대를 정의하고 그 구현을 서브 클래스에서 하는 패턴 템플릿 메서드를 이용하면 알고리즘의 구조는 그대로 유지하면서 서브 클래스에서 특정 단계를 재정의할 수 있다. AbstractClass의 templateMethod()에는 알고리즘의 골격이 정의되어 있다. 모든 객체들이 공통으로 수행하는 작업은 AbstractClass에서 수행한다. 그 후 나머지는 abstract 메서드로 구현하여 서브 클래스에서 구현하게 만든다. ​예제 AbstractClass public abstract class CaffeineBeverage { final void prepareRecipe() { boilWater(); brew(); pourInCup(); // hook i..
퍼사드 패턴(Facade Pattern), 최소 지식 원칙 퍼사드 패턴 어떤 서브시스템의 일련의 인터페이스에 대한 통합된 인터페이스를 제공한다. 퍼사드에서 고수준 인터페이스를 정의하기 때문에 서브시스템을 더 쉽게 사용할 수 있다. 어댑터 패턴과의 차이 어댑터 패턴은 인터페이스를 변경해서 클라이언트가 필요로 하는 인터페이스로 변환하는 것 퍼사드 패턴은 어떤 서브시스템에 대한 간단한 인터페이스로 제공하는 것이다. 퍼사드 패턴 다이어그램 수많은 subsystem class 들을 Facade에서 통합된 인터페이스로 제공한다. Clent는 Facade 하나만 알고 있으면 수많은 subsystem class들을 사용할 수 있다. 예제 영화관에서 영화를 상영하는 시스템이 있다고 생각해보자. 영화를 상영하기 위해 필요한 절차는 아래와 같다. (1) 조명을 영화관 모드로 변경 ..
어댑터 패턴(Adapter Pattern) 어댑터 패턴 한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환한다. 어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스 들을 연결해서 쓸 수 있다. ​ Target 클라이언트는 Target만을 알고 있다. 즉 다른 인터페이스는 이 Target으로 변환되어야 한다. Adapter Adaptee를 Target으로 변환해주는 중간 매개체이다. Adaptee 변환이 될 대상이다. 예제 새로운 번역기가 있고 오래된 번역기가 있는데 클라이언트는 새로운 번역기만 알고 있다. Target public interface NewTranslator { public void koreanTranslation(); public void chineseTranslation(); pu..
커맨드 패턴(Command Pattern) 커맨드 패턴 요청을 객체의 형태로 캡슐화하여 요청과 해당 요청 수행을 분리하는 디자인 패턴 요구 사항을 객체로 캡슐화할 수 있으며, 매개변수를 써서 여러 가지 다른 요구 사항을 집어넣을 수도 있다. 요청 내역을 큐에 저장하거나 로그로 기록할 수도 있으며 작업 취소 기능도 지원 가능하다. Client ConcreteCommand를 생성하고 Receiver를 설정한다. Receiver 요구 사항을 수행하기 위해 어떤 일을 처리해야 하는지 알고 있는 객체이다. ConcreteCommand에서 Receiver를 가지고 있으며 ConcreteCommand는 명령에 따라 Receiver의 기능을 수행한다. ConcreteCommand 특정 행동과 리시버 사이를 연결해 준다. Invoker에서 excute(), un..