Design Pattern for Smalltalk – Proxy

t_Dpsc_chapter04_Proxy_01v2

Proxy패턴의 핵심은 “허상같은 객체”라는 점이다. Proxy객체는 Client에 대해서는 실제적 클래스 같은 역할을 하지만 그 정체는 “대리자”에 가깝다. Proxy 객체는 실제적인 역할을 하는 인스턴스가 존재(생성전) 하지 않더라도 Client의 요청에 대해 아무일도 없는것처럼 중간처리를 모두 맡아서 한다.

[디자인 패턴]에서도 Proxy 패턴의 몇가지 유형이 나오지만 이중에 백미는 분산 객체라 할 수 있다. Client는 마치 Local에 존재하고 있는 객체인 것 처럼 사용하지만 Proxy객체 내부에서는 원격지에 있는 객체라고 하더라도 문제없이 처리하며 network 문제등의 상황에서 복잡한 경우들을 책임진다. 현재의 분산객체 시스템의 원형이라 할 수 있으며 Client는 별도의 network 상황을 고려하지 않고 Local 객체를 처리하듯, 일관성있는 개념으로 프로그래밍을 할 수 있다. 프로그램의 작성에 있어서 이런 통일된 개념은 중요하다.

그리고 Proxy패턴의 도 하나 장점은 리소스의 절약에 있다. 실제 시스템에서 많은 리소스를 사용하는 인스턴스를 필요할 때 만 사용하려 하는 경우 해당 인스턴스의 생성 및 관리(창조자 (reference) 카운팅 등)를 Proxy객체에서 담당하고 Proxy객체는 관리하는 실제 인스턴스와 동일한 인터페이스를 사용함으로서 Client에게는 코드의 일관성을, 시스템에 대해서는 효율적인 리소스의 사용을 가능하게 해준다.

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 패턴은 복잡한 로직을 감추고, 단순한 사용방법을 제공하며 클라이언트가 필요로 할 때 세부 클래스를 바로 접근하게도 해주는 “정돈하는 패턴”이라 할 수 있다.