fullstack

[디자인 패턴] 프록시 패턴(Proxy Pattern)

디자인 패턴

- 개념

다른 객체에 대한 접근을 제어하기 위해 대리자 역할을 하는 객체를 두는 패턴

대리자는 일을 처리하고 완료되면 그 결과를 알려준다

대리자 역할을 하는 객체는 흐름 제어만 할 뿐 결과값을 조작할 수 없다


프록시 패턴은 단순 포인터보다 더욱 다방면에 활용할 수 있다

1. 실제 객체를 요청하기 전이나 후에 인가 처리 (보호용 프록시)

2. 자원이 많이 드는 객체에 대해 백그라운드 처리 (가상 프록시)

3. 원격 메소드를 호출하기 위한 작업 (원격 프록시)

4. 실제 객체에 접근이 일어날 때 추가적인 행동을 수행 (스마트 참조자)




- 구현



Proxy는 Subject와 동일한 인터페이스를 제공하며, 실제 대상에 대한 접근을 제어하고 실제 대상의 생성과 삭제를 책임집니다. 그리고 Proxy 종류에 알맞는 요청을 수행합니다

Subject는 공통된 인터페이스를 정의하며, RealSubject가 요청되는 곳에 Proxy를 사용할 수 있게 합니다

Proxy 클래스는 자신이 받은 요청을 RealSubject 객체에 전달합니다




- 관련 패턴

적응자 패턴 (Adapter Pattern) - http://cpp11.tistory.com/57

장식자 패턴 (Decorator Pattern) - http://cpp11.tistory.com/58


[디자인 패턴] 책임 연쇄 패턴 (Chain of responsibility Pattern)

디자인 패턴

- 개념

요청을 처리할 수 있는 기회를 여러 객체에게 주어, 요청하는 객체와 처리하는 객체 간의 결합도를 없앨 수 있는 패턴




- 구현


Handler는 요청을 처리하는 인터페이스를 정의하고, 후속 처리자(successor)와의 연결을 구현합니다

ConcreteHandler는 자신이 처리할 행동이 있다면 처리하고, 아니라면 후속처리자에게 요청을 보냅니다

사용자가 처리를 요청하면 이 요청이 실제로 요청을 받을 책임이 있는 ConcreteHandler 객체를 만날 때까지 연결 고리를 따라서 계속 전달됩니다




- 관련 패턴

복합체 패턴 (Composite Pattern)


[디자인 패턴] 복합체 패턴 (Composite Pattern)

디자인 패턴

- 개념

객체들을 트리 구조로 구성하여 부분과 전체를 나타내는 계층구조로 만드는 패턴

개별적인 객체들과 객체들의 집합간의 처리 방법의 차이가 없을 경우, 같은 방법으로 취급하여 사용자가 동일하게 다룰 수 있도록 한다




- 구현


Component는 표현할 모든 구성요소들의 추상적인 인터페이스를 정의합니다

Leaf는 가장 말단의 객체로 Component에서 지정된 인터페이스를 구현합니다

Composite는 Component요소를 자식으로 가지며, Component요소를 관리하기 위한 추가적인 연산을 구현합니다




- 관련 패턴

장식자 패턴 (Decorator Pattern) - http://cpp11.tistory.com/58

플라이급 패턴 (Flyweight Pattern) - http://cpp11.tistory.com/60

반복자 패턴 (Iterator Pattern)

방문자 패턴 (Visitor Pattern)

[디자인 패턴] 플라이급 패턴 (Flyweight Pattern)

디자인 패턴

- 개념

개체의 상태를 공유 풀에 형성하여 메모리를 절약하는 기법

다량의 객체를 만들 때 공유 풀에 저장해 관리하여, 한번 생성된 객체는 중복으로 생성하지 않고 공유를 통해 효율적으로 자원을 활용한다




- 구현

FlyweightFactory에서 플라이급 객체를 생성하고 관리합니다. 또한 객체가 제대로 공유되도록 보장합니다

사용자는 ConcreteFlyweight의 인스턴트를 직접 만들 수 없고, FlyweightFactory를 통해서만 객체를 얻어야 합니다




-관련 패턴

복합체 패턴 (Composite Pattern)

상태 패턴 (State Pattern)

전략 패턴 (Strategy Pattern) - http://cpp11.tistory.com/59


[디자인 패턴] 전략 패턴 (Strategy Pattern)

디자인 패턴

- 개념

특정한 계열의 알고리즘들을 정의하고 각 알고리즘을 캡슐화 하여 이 알고리즘들을 해당 계열 안에서 상호 교체가 가능하도록 한다

즉 동적으로 알고리즘을 교체 할 수 있는 구조

하나의 결과를 만드는 목적은 동일하지만, 그 목적을 달성할 수 있는 방법이 여러가지가 존재할 경우 사용




- 구현


Strategy는 제공하는 알고리즘들의 공통의 인터페이스를 정의합니다

그리고 각 ConcreteStrategy에서 이 인터페이스를 바탕으로 실제 알고리즘을 구현합니다


Context는 Strategy객체에 대한 참조자를 관리하고, 실제로는 Strategy 서브클래스의 인스턴스를 가지고 있음으로써 구체화 합니다. 또한 Strategy 객체가 자료에 접근하는데 필요한 인터페이스를 정의합니다


사용자는 필요한 알고리즘에 해당하는 ConcreteStrategy 객체를 생성하여 이를 Context 클래스에 보냅니다

그리고 어떤 ConcreteStrategy 객체를 생성했던지 상관없이, Context에 정의된 인터페이스를 통해 동일하게 사용이 가능합니다




- 관련 패턴

플라이급 패턴 (Flyweight Pattern)

[디자인 패턴] 장식자 패턴 (Decorator Pattern)

디자인 패턴

- 개념

장식자 패턴(Decorator Pattern) 은 객체를 동적으로 서브클래스를 이용해 확장하는 패턴

장식자 패턴은 디자인 원칙중 하나인 OCP(Open-Closed Principle) 법칙을 준수하여, 기존의 코드를 건드리지 않고 확장하도록 합니다




- 구현

 


Component는 동적으로 추가할 서비스를 가질 가능성이 있는 객체들에 대한 인터페이스이고, ConcreteComponent는 추가적인 서비스가 실제로 정의도어야 할 필요가 있는 객체입니다


Decorator에 Component에 정의된 인터페이스를 만족하도록 인터페이스를 정의하여 ConcreteDecorator들을 통하여 Component에 새롭게 추가할 서비스들을 구현해 줍니다


그럼 Decorator는 자신의 Component 객체 쪽으로 요청을 전달할 때, 자신만의 추가 연산을 선택하여 수행할 수 있습니다




- 관련 패턴 

적응자 패턴 (Adapter Pattern) - http://cpp11.tistory.com/57

복합체 패턴 (Composite Pattern)

전략 패턴 (Strategy Pattern)

[디자인 패턴] 적응자 패턴 (Adapter Pattern)

디자인 패턴

- 개념

인터페이스의 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 쓰기 위해, 한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환한다

그럼 호환되지 않는 인터페이스를 사용하는 클라이언트를 그대로 활용할 수 있다. 또한, 클라이언트와 인터페이스를 분리하여 향후 인터페이스가 바뀌더라고, 변경 내역이 어댑터에 캡슐화 되어 클라이언트를 변경할 필요가 없다




- 구현


Adapter는 한 인터페이스를 다른 인터페이스로 적응시킵니다

사용자는 Adapter에 해당하는 클래스의 인스턴스에게 연산을 호출하고, Adapter는 적응대상자(Adaptee)의 연산을 호출하여 요청을 수행합니다




- 관련패턴

가교 패턴 (Bridge Pattern)

장식자 패턴 (Decorator Pattern) - http://cpp11.tistory.com/58

프록시 패턴 (Proxy Pattern)


[디자인 패턴] 퍼사드 패턴 (Facade Pattern)

디자인 패턴

- 개념

퍼사드 패턴은 어떤 서브시스템의 일련의 인터페이스에 대한 통합된 하나의 인터페이스를 제공하여, 서브시스템을 사용하기 쉽도록 상위 수준의 인터페이스를 정의하는 것이다




- 구현


Facade는 단순하고 일관된 통합 인터페이스를 제공하며, 사용자의 요청을 해당 서브시스템 객체에 전달한다

Subsystem 클래스들은 기능을 구현하고, Facade 객체로 할당된 작업을 처리하지만 Facade에 대한 아무 정보가 없다

사용자는 Facade에 정의된 인터페이스를 통해 Subsystem과 상호작용 한다




- 관련 패턴

중재자 패턴 (Mediator Pattern) - http://cpp11.tistory.com/55

추상팩토리 패턴 (Abstact Pattern)



[디자인 패턴] 중재자 패턴 (Mediator Pattern)

디자인 패턴
- 개념
중재자 패턴은 말 그대로 서로 명령을 주고 받는 부분을 중재하는 패턴이다
클래스간에 복잡하게 서로 명령을 주고 받는 것을 중재자에게만 전달하고, 중재자는 해당 명령을 적절한 개체에게 전달해 준다. 즉, 클래스간의 복잡한 로직을 캡슐화하여 하나의 클래스에 위임하여 처리하는 패턴이다
중재자 패턴은 M:N 관계에서 M:1 관계로 복잡도를 떨어뜨려 유지보수 및 재사용에 유리하며, 복잡한 상호작용을 하기 위한 복잡한 관계를 단순화 시킬 수 있다.



- 구현


Mediator는 Colleague 객체와 교류하는데 필요한 인터페이스를 정의합니다

ConcreteMediator는 Colleague 객체와 조화를 이루며 협력 행동을 구현하고, Colleague들을 파악하고 관리합니다

Colleague 클래스들은 자신의 중재자 객체가 무엇인지 파악하고, 다른 객체와 통신이 필요하면 그 중재자를 통해 통신되도록 하는 동료 객체입니다

Colleague는 Mediator에서 요청을 송수신하고, Mediator는 필요한 Colleague 사이에 요청을 전달합니다




- 관련패턴

퍼사드 패턴 (Facade Pattern) - http://cpp11.tistory.com/56

감시자 패턴 (Observer Pattern) - http://cpp11.tistory.com/54


[디자인 패턴] 감시자 패턴 (observer pattern)

디자인 패턴

- 개념

감시자 패턴은 하나의 개체가 여러 개체의 상태 변화를 감지하는 역할을 담당하게 하는 패턴이다

감시자는 다른 개체의 상태의 변화를 통보를 받는 역활과 이 변화를 구독하기를 원하는 개체에게 알려주는 역할을 한다

다른 개체의 상태 변화에 따라 의존하는 개체가 있다면 감시자 패턴을 고려한다




- 구현


Observer 클래스를 상속받아 만든 클래스들 (ToneViewer, BrightnessViewer, SaturationViewer) 은 Subject 클래스의 AddObserver() 함수를 통해서 Subject 클래스를 상속한 Picture 클래스에 대해서 구독을 등록할 수 있다

(당연히 RemoveObserver() 함수를 통해서 해제도 가능)


Picture 클래스에서 특정 이벤트가 일어나면 Notify() 함수를 호출하여 구독중인 모든 클래스들에게 알린다


그럼 구독중인 각각의 클래스들은 Update() 함수를 호출하게 되고, 각각 구현된 원하는 동작을 하면된다


이렇게 하면 Subject와 Observer 간에 의존도가 없어진다. 즉, Subject는 Observer에 대한 목록을 관리하기만 하면 된다




- 관련 패턴

중재자 패턴 (Mediator Pattern) - http://cpp11.tistory.com/55

단일체 패턴 (Singleton Pattern)