본문 바로가기
Programming/c++ Design Pattern

[C++ Design Pattern] Strategy Pattern

by 드가보자 2023. 11. 29.

strategy pattern(전략 패턴) 

template<typename T> struct IAllocator
{
	virtual T* allocate(int size) = 0;
	virtual void deallocate(T* p, int size) = 0;
	virtual ~IAllocator() {}
};

template<typename T>
class vector
{
	T* buff;

	IAllocator<T>* ax;
public:
	void set_allocator(IAllocator<T>* p) { ax = p; }
    
	void resize(int n)
	{
		buff = ax->allocate(n);

		ax->deallocate(buff, n);
	}
};

template<typename T> class newAllocator : public IAllocator<T>
{
public:
	T* allocate(int size) override { return new T[size]; }
	void deallocate(T* p, int size) override { delete[] p; }
};
int main()
{
	vector<int> v;
	newAllocator<int> na;
	v.set_allocator(&na);
}

 

IAllocator라는 메모리를 할당하기 위해서 template를 사용해 Interface를 만든다. => 어떤 Type을 인자로 받을지 모르기 때문

allocate와 deallocat는 순수 가상 함수로 두어서, 해당 interface를 사용하는 클래스들은 모두 필수적으로 두 함수를 정의 해야만한다.

 

class newAllocator는 new, delete를 사용해서 메모리를 할당/해지 하려고 한다. 

 

class vector는 newAllocator를 멤버 변수로 가지고, 멤버 변수의 함수 allocate와 deallocate를 사용하여 메모리 할당/해지를 수행할 수 있다. 만약 malloc을 전문으로 하는 class를 만든다고 해도 vector입장에서는 malloc class를 멤버 변수로 가지고 있기만 하면 allocate , deallocate를 수행하면 되는 것이다. 

 

Strategy는 각 기능들, malloc이나 , new 각 기능들을 별도의 클래스로 제공해서, vector입장에서는 어떤 class를 멤버 변수로만 가질지 정해주면 된다.

 

해당 코드(전략 패턴)의 장점은

메모리 할당 정책이 vector와 분리되어 있다는 점이고, list나 map 등 다른 Container를 만들어도 해당 메모리 할당/해지 class를 사용할 수 있다. 

 

단점은 

메모리 할당과 해지에 사용되는 함수가 모두 virtual이기 때문에 느리다. 

 

 

'Programming > c++ Design Pattern' 카테고리의 다른 글

[C++ Design Pattern] Decorator  (0) 2023.11.29
[C++ Design Pattern] Composite  (1) 2023.11.29
[c++ Design Pattern] Template Method  (0) 2023.11.29
[C++] OCP Code 예제  (1) 2023.11.29
[C++] 추상 클래스  (0) 2023.11.29