fullstack

[디자인 패턴] 전략 패턴 (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)


[GAE] Google App Engine에 python flask 개발환경 셋팅하기

Web

google app engine 에서 python flask 개발환경을 셋팅해 보겠습니다



google app engine console - https://console.cloud.google.com/


우선 새 프로젝트를 생성해야겠죠?



언어는 당연히 python을 선택합니다



지역을 선택합니다




알아서 백엔드 서비스를 만들어줍니다



오른쪽 상단의 이 아이콘을 눌러 Google Cloud Shell을 활성화 해 줍니다




Shell 이 활성화 되었습니다




다음과 같이 입력합니다




DIR=src/yobot-1/python_flask => DIR 이라는 변수에 폴더경로를 지정합니다

git clone https://github.com/GoogleCloudPlatform/appengine-flask-skeleton $DIR 

=> DIR에 지정한 폴더 경로에 google에서 만들어놓은 flask 뼈대 저장소를 clone 합니다


그럼 벌써 기본적인 flask 개발환경 셋팅이 끝났습니다 

서버환경 만드는게 이렇게 쉽습니다 구글 갓 입니다 ..


빌드는 해당경로로 이동 후 ( cd DIR )

gcloud app deploy app.yaml --project myProject ( myProject = 내 프로젝트명) 명령어로 할 수 있습니다


빌드 후 다음과 같이 내프로젝트명.appspot.com 주소로 열어보시면 Hello World! 를 볼 수 있습니다



- 끝 -

[python] python에서 한글 사용하기

Web

python은 기본 인코딩이 ascii 이기 때문에, 그냥 사용시 한글은 ascii로 해석이 불가능 해

문법에러를 발생시킨다.


이를 해결하기위해 다음과 같이 스크립트 파일 맨위에 파일의 인코딩을 명시해 주어야 한다


1
2
#!/usr/bin/python  
# -*- coding: utf-8 



[C++] 템플릿 (Template)

Language/C++

템플릿(Template)은 같은 기능을 다양한 자료형에 사용할 수 있도록 하는 틀을 말한다.

즉, 기능은 이미 결정되어 있지만 자료형이 결정되어 있지 않은 특징을 가지고 있다.


다음을 템플릿을 이용한 함수 템플릿이다.


1
2
3
4
5
template <typename T>
T sum(T a, T b)
{
    return a+b;
}



위의 template <typename T> 는 T라는 이름에 대해서, 다음에 정의하는 대상을 템플릿으로 선언한다는 것을 뜻한다.

이제 이 함수는 어떤 인자가 전달되는가에 따라서 자료형이 결정되게 된다.


'Language > C++' 카테고리의 다른 글

[C++] 임시 객체  (0) 2016.01.04
[C++] 연산자 오버로딩  (0) 2016.01.04
[C++] 다중 상속  (1) 2015.12.28
[C++] virtual 소멸자  (0) 2015.12.26
[C++] 순수 가상 함수와 추상 클래스  (0) 2015.12.26

[C++] 임시 객체

Language/C++

임시 객체는 말 그대로 임시적으로 생성되었다가 소멸되는 객체를 말한다.

객체를 생성하면서 이름을 주지 않으면  임시객체가 생성되고, 그 줄에서 사용하지 않으면 바로 소멸된다.


다음은 임시 객체의 예제이다.


1
2
3
4
5
6
7
8
int main()
{
    cout << "임시객체 생성 전" << endl;
    AAA();
    cout << "임시객체 생성 후" << endl;
 
    return 0;
}




바로 소멸되는 임시 객체를 어디서 쓰나라고 생각할 수도 있지만 객체를 생성해서 바로 리턴해주는 함수 등 쓰일 곳은 많다.

또한, 임시 객체를 쓰면 컴파일러에 따라서 속도가 빨라지고, 메모리를 효율적으로 사용하게 되므로 효율적이라고 할 수 있다..

'Language > C++' 카테고리의 다른 글

[C++] 템플릿 (Template)  (0) 2016.01.10
[C++] 연산자 오버로딩  (0) 2016.01.04
[C++] 다중 상속  (1) 2015.12.28
[C++] virtual 소멸자  (0) 2015.12.26
[C++] 순수 가상 함수와 추상 클래스  (0) 2015.12.26