Design Pattern for Smalltalk – Flyweight

t_Dpsc_chapter04_Flyweight_01

[디자인 패턴]에서는 flyweight 패턴의 설명에서 공유와 지원을 키워드로 잡고있다. flyweight패턴은 그 설명 그대로 특수한 작은 목적을 가진 인스턴스를 여러 클라이언트에서 공유함으로서 필요한 리소스의 양을 줄여 효율적인 시스템을 유지하게 하는데에 그 목적이 있다.

flyweight패턴에서는 인스턴스를 관리하며 생성, 제거등을 담당하는 관리자 클래스와, 생성된 인스턴스로서 공유되는것이 목적으로 시스템에 의해 사용되는 인스턴스의 두가지 요소가 중요하다.

flyweight 패턴의 설명에서는 내내 공유를 통한 사용되어야 할 인스턴스의 개수를 줄임으로서 리소스의 절약과 시스템의 효율 향상을 얻을 수 있다고 언급하고 있다.

[디자인 패턴]은 flyweight 패턴 관련 부분에서 마지막 단락에 좋은 예를 소개한다. 확실히 화면에 여러개의 요소가 있을 때 각 요소별로 Layout을 따로 가지고 있는 것 보다는
Layout 만을 관리하는 인스턴스를 별도로 두고 요소들을 관리하는게 효율적일 것이다. 중요한 건 flyweight의 인스턴스들은 각자 한가지, 또는 단순한 수준의 정보만 모아서 관리함으로서 효율을 높이기 위한 단위로 구성되었을 때 의미가 있으며, 관리가 필요한 단순정보가 많아도 관리해야하는 최종 대상에 대한 정보의 총 분량이 그리 많지 않다면 필요없는 overhead가 생길 수 있으니 그점은 반드시 주의해야 한다.

Design Pattern for Smalltalk – Facade

t_Dpsc_chapter04_Facade_01

Facade는 불어로서 정면, 외관이라는 뜻이며 “퍼사드”라고 발음한다고 한다. 단어에서 의미하는 대로 이 패턴은 패턴에서 감싸고자 하는 클래스 그룹을 외부로부터 숨기고 편의에 맞게 사용하는 방법을 단순화시켜서 제공하는것에 그 목적이 있다.

보다 단순하게 설명하자면 단순화된 외부 인터페이스를 클라이언트에게 제공하는 게이트 웨이(관문)으로 표현할 수 있다.

여기까지만 들으면 객체지향의 요건중에 하나인 캡슐화(incapsulation)와 비슷하게 들리지만 결정적인 차이가 하나 있다. Facade패턴은 외부에서 내부로의 직접적인 접근을 막지는 않는다는 점이다. Facade 패턴의 주된 목적은 클라이언트로 하여금 여러 클래스들의 사용법을 일일히 익히게 하는 번거로움 대신에 Facade 클래스가 둘러싸는 클래스들에 대한 복잡한 사용법을 정리해서 대행하며 클라이언트에게는 필요한 최소 수준의 인터페이스만 제공함으로서 사용에 대한 번잡함을 막고 의사소통에 대한 최소한의 진행을 위한 단순함을 이루어 내는것에 있다고 할 수 있다.

t_Dpsc_chapter04_Facade_02

결과적으로 클래스의 배치 프로세스 batch process를 위한 편의성으로 이루어진 패턴이라는 것이 보다 정직한 표현이라 하겠다. Facade 패턴은 복잡한 로직을 감추고, 단순한 사용방법을 제공하며 클라이언트가 필요로 할 때 세부 클래스를 바로 접근하게도 해주는 “정돈하는 패턴”이라 할 수 있다.

Design Pattern for Smalltalk – Decorator

t_Dpsc_chapter04_Decorator_01

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

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

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

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