본문 바로가기

디자인 패턴

(8)
컴포지트 패턴(Composite Pattern) 컴포지트 패턴 객체들을 트리 구조로 구성하여 부분과 전체를 나타내는 계층구조로 만들 수 있다. 이 패턴을 이용하면 클라이언트에서 개별 객체와 다른 객체들로 구성된 복합 객체를 똑같은 방법으로 다룰 수 있다. 이터레이터 패턴에서 구현한 예제에서 만약 점심, 저녁 메뉴에 디저트 메뉴들을 추가해야 한다고 가정해보자. 이럴 때 컴포지트 패턴을 구현한다면 다른 메뉴들을 추가하더라도 처음부터 구현할 필요 없이 간단하게 구현할 수 있다. Component Component는 Composite와 Leaf의 부모가 되고 해당 두 객체가 가질 수 있는 동작들을 가지고 있다. Composite Composite는 Component를 컬렉션으로 가지고 있다. 즉 자기 자신인 Composite와 Leaf를 가질 수 있는 것이다..
퍼사드 패턴(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..
추상 팩토리 패턴(Abstract Factory Pattern) 추상 팩토리 패턴 인터페이스를 이용하여 서로 연관된, 또는 의존하는 객체들을 구상 클래스를 지정하지 않고도 생성하는 패턴 다이어 그램을 보면 지난번의 팩토리 메서드 패턴과는 조금 다른 것을 알 수 있다. 팩토리 메서드 패턴은 실제 팩토리를 구현하는 인스턴스를 만들 때 상위 클래스를 확장하고 팩토리 메서드를 오버라이드 하여 상속을 통해 인스턴스를 생성하였다. 하지만 추상 팩토리 패턴은 AbstractFactory를 Interface 타입으로 생성하고 그 인터페이스를 실체화하여 객체를 생성하는 것을 알 수 있다. 예제 운영체제에 따른 GuiFactory에 대한 예제이다. AbstractFactory public interface GuiFactory { public Button createButton(); p..
데코레이터 패턴(Decorator Pattern) 데코레이터 패턴 주어진 상황 및 용도에 따라 어떤 객체에 책임을 덧붙이는 패턴 객체에 추가적인 요건을 동적으로 첨가하며, 기능 확장이 필요할 때 서브 클래싱 대신 쓸 수 있는 유연한 대안이 될 수 있다. Component 실질적인 인스턴스를 컨트롤하는 역할 ConcreteComponent Component의 실질적인 인스턴스의 부분이며 책임의 주체의 역할 Decorator Component와 ConcreteDecorator를 동일시하도록 해주는 역할 ConcreteDecorator 실질적인 장식 인스턴스 및 정의이며 추가된 책임의 주체 부분 예제 커피 주문을 예시로 들어서 진행해 보자. Component public interface Beverage { public double cost(); public..
옵저버 패턴(Observer Pattern) 옵저버 패턴 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다 의존성을 정의한다. 어떠한 객체에 의존하는 다른 객체들을 Observer , 한 객체를 Subject라고 한다. 클래스 다이어그램 Subject와 Observer는 인터페이스로 구현한다. 이렇게 Subject와 Observer를 인터페이스로 구현하여 사용하면 Subject는 Observer 인터페이스만 구현하고 Obsever의 구상 클래스가 무엇인지 알 필요가 없다. 특징 옵저버는 언제든지 새로 추가할 수 있다.(Observer 인터페이스를 구현) 새로운 형식의 옵저버를 추가해도 Subject를 전혀 변경할 필요가 없다. Subject와 옵저버는 서로 독립적으로 재사용 가능하다...
스트래티지 패턴(Strategy Pattern) 인터페이스 Interface를 이용하면 기능에 대한 선언과 구현이 분리 가능하다. Interface를 통해 기능의 사용 통로가 될 수 있다. 델리게이트 특정 객체에 기능을 사용하기 위해 다른 객체의 기능을 호출하는 것이다. 스트레티지 패턴(전략 패턴) 특정한 알고리즘을 정의하고 각 알고리즘을 캡슐화하여 실행중에 알고리즘을 선택할 수 있는 디자인 패턴이다. 이 패턴을 활용하면 클라이언트와는 독립적으로 다양한 알고리즘을 정의, 추가 할 수 있다. 위의 다이어그램에 맞게 구현을 해볼 것이다. Clinet는 GameCharacter 이 된다. Strategy Interface는 Weapon이 된다. Stratecy Clasee 들은 Knife, Sword, Ax들이 될 것이다. Weapon이라는 인터페이스를 구..