Design Pattern for Smalltalk – Decorator

t_Dpsc_chapter04_Decorator_01

Decorator패턴은 원래의 클래스에 변경을 전혀 추가하지 않고 원하는 기능을 추가하려고 할 때 사용된다. 추가를 원하는 기능이 2개 이상인 경우 한개의 Decorator 추상클래스를 만든 뒤 하위클래스를 추가하려는 기능별로 구현한 후 이 하위클래스를 겹겹이 적용하면 하나의 객체에 부수의 기능을 코드 수정없이 사용할 수 있다.

Decorator 패턴의 구현에는 가장 중요한 점이 있다. 트리구조 안의 모든 클래스는 동일한 인터페이스를 지원해야 만들어진 하위클래스를 원활하게 사용할 수 있다.Decorator패턴의 이런 특성덕분에 클라이언트는 사용하는 객체가 Decorator 객체인지, 원래의 클래스인지를 구분하지 못한다. 트리구조에 포함된 모든 클래스의 인터페이스가 동일하기 때문이다. 이에대한 개념은 [디자인패턴] 251p 상단에 있는 코드로 정확하고 간결하게 설명될 수 있다.

Decorator패턴은 객체의 인터페이스는 유지하면서 무언가를 덧대어서 동작에 변화를 준다는 점에서 프로그래밍에 유연성과 확장성을 보태주며, 원래의 클래스에 코드 수정을 일으키지 않는다는 점에서 매우 유용하다. 이런점 덕분에 기능의 추가가 필요할 때 Decorator패턴을 사용하면 제한없이 기능별로 만들어지는 코드가 수정된 하위클래스의 남용을 막을 수 있는 이점이 있다.

Decorator패턴에서 가능의 요구에 따른 하위클래스의 수평적 확장은 수직적 확장에 비해 관리의 편의성도 제공해주게 된다.

Design Pattern for Smalltalk – Composite

t_Dpsc_chapter04_Composite_01v02

Composite 패턴은 객체의 그룹됨을 이용한 객체의 임의적 묶음에 대한 패턴이다. Composite 패턴은 크게 Component, Composife, leaf 등으로 구성된다. Component는 클래스 구조에서 최상위에 해당하는 요소로서 객체의 그룹화 및 포함하는 인스턴스의 동적관리를 위한 내부적 자료구조와 사용을 위한 메서드(인터페이스)를 포함하게 되며 일반적으로 추상클래스가 그 성질이 된다.

Composite는 container로서의 성질을 가지며 하위인스턴스를 포함할 수 있다. leaf는 단말의 성질을 가지며 하위인스턴스를 포함할 수 없고 인스턴스의 포함에 대한 메서드도 동작시킬 수 없다. leaf는 종류별로 고유의 특성을 가지는것이 일반적이며 Composite에 의해 관리될 수 있는 (그룹의 요소를 포함/제거 할 수 있는) 성질을 가진다.

Composite와 leaf는 본질적으로 같은 뿌리에서 나왔으므로 기본적인 뼈대는 동일하다고 봐야하지만 실제 사용되는 부분에서는 차이가 있다고 인식해야 한다. 이에대한 좋은 예로서 [디자인 패턴]에 언급되어있는 computer parts에 대한 내용이 좋은데, 개념적인 단계에서 Composite 패턴을 활용까지 풀어냈다고 할 수 있다.

Composite의 특징에는 factory Method 를 이용한 행위 구현에 대한 위임이 있다. 구조화 된 객체 트리구조와 추상클래스에서 하위클래스로 이어지는 구체적 구현에 대해 위임의 형태를 가지는 경우라면 Composite 패턴으로 간주하기도 한다.

[DPSC composite 패턴 – Signal Collection] 부분참고.

Design Pattern for Smalltalk – adapter

t_Dpsc_chapter04_Adapter_01v2

adapter패턴은 어떤 class의 interface가 원하는 규칙에 어긋날 때 범용성을 확보하기 위해서 어떤 class의 앞줄에 원하는 interface를 구현해서 인자나 동작등을 변환하는 구조를 의미한다. 이 경우 어떤 class를 adaptee, 동작이나 interface를 변환하는 역할을 adapter 라고 한다. 구현에는 크게 분류해서 class adapter와 object adapter의 두가지 방식이 있다.

class adapter 방식은 기반이 되는 상위클래스를 하나 상속해서 그것에 살을 덧붙여 구현하는 방식으로 오버라이드를 사용할 수 있으며 새로 구현된 클래스의 인스턴스가 목적에 대한 직접적인 역할을 가지게 된다.

object adapter 방식은 별도의 클래스를 하나 만들어서 그 클래스에 필요한 다른 클래스(adaptee)의 인스턴스를 내부 조작에 따라 그때 그때 사용하는 것으로서, 유연하기는 하지만 직접적인 역할은 해당 기능을 하는 클래스이 인스턴스로 넘기게 된다. 이 경우 adaptee 클래스를 내부에서 바로 사용하는 것 보다는 adaptee에 사용을 원하는 용도의 하위클래스를 만들고, 그렇게 만들어진 하위클래스의 인스턴스를 사용하는것이 가장 좋다.