단위 전략 디자인

·2022년 9월 2일

c++ 디자인 패턴

목록 보기
5/9
  • 코드 누리 디자인 패턴 강의를 보고 , 복습한 내용입니다.

단위 전략 디자인

  • 개념

    : 변경되는 정책 클래스를 인라인 함수로 만들고, 해당 클래스를
    템플릿 인자로 사용하는 기법을 말함.

  • 특징
    : c++에서 많이 사용됨.

  • 알아야 하는 개념
    : 멀티스레드는 실행 시간에 결정되는 것이 아님.

  • 만드는 방법.

    1) 인테퍼이스 클래스를 멤버로 사용하지 않음.
    +)추가적으로 설정하는 함수도 필요 없음.
    2) 템플릿 인자로 들어오는 클래스의 함수들을 인라인 함수로 만듦.
    3) 템플릿 인자로 유입되는 클래스 타입을 멤버 객체로 가지고 있음.
    -> 그 멤버 객체의 함수를 호출함.

problem

  • 설명 : 멀티스레드에 안전하지 않은 사용자 정의 리스트가 있음.
    -> 전역 변수로 선언했기 때문에, 멀티스레드에 안전하지 않음.
#include <iostream>
#include <list>
using namespace std;

template<typename T> class List
{
private : 
	list<T> ll;
public:
	void push_front(const T& a)
	{
		//    Lock();
			//...
		ll.push_front(a);
		//    Unlock();
	}
};

List<int> s; 

int main()
{

	s.push_front(10);

}

가) 전략 패턴, 인터페이스 클래스를 만들고, 정책에 사용해서
멀티스레드에 안전한 코드로 만들어라

나) 단위 전략 패턴. (위에서 설명한 내용) 을 이용해
코드를 구현하라.


가)번에 대한 코드

#include <iostream>
#include <list>
using namespace std;

class base
{
public: 
	virtual void Lock() = 0;
	virtual void UnLock() = 0;
};

class MMutex : public base
{
public :
	virtual void Lock() override
	{
		cout << "Lock " << endl;
	}
	virtual void UnLock() override
	{
		cout << "unLock" << endl;
	}
};

template<typename T> class List
{
private : 
	list<T> ll;
	base * obj = 0;

public:

	void set(base* _obj)
	{
		obj = _obj;
	}

	void push_front(const T& a)
	{
		obj->Lock();
		ll.push_front(a);
		obj->UnLock();
	}
};

List<int> s; 

int main()
{
	MMutex *mutexx = new MMutex;
	s.set(mutexx);
	s.push_front(10);

}

나)번에 대한 코드

#include <iostream>
#include <list>
using namespace std;

class NoMmutex
{
public:
	inline void Lock()
	{
	}
	inline void UnLock()
	{
	}
};

class MMutex 
{
public :
	inline void Lock() 
	{
		cout << "Lock " << endl;
	}
	inline void UnLock() 
	{
		cout << "unLock" << endl;
	}
};

template<typename T, typename LLock = NoMmutex> class List
{
private : 
	list<T> ll;
	LLock obj;

public:

	void push_front(const T& a)
	{
		obj.Lock();
		ll.push_front(a);
		obj.UnLock();
	}
};

List<int, MMutex> s; 


int main()
{
	
	s.push_front(10);

}
profile
🔥🔥🔥

0개의 댓글