소프트웨어 공부/디자인패턴

스트래티지 패턴(Strategy Pattern)

야곰야곰+책벌레 2022. 4. 4. 16:24
728x90
반응형

스트래티지 패턴(Starategy Pattern)에서는 알고리즘 군을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만든다. 스트래티지 패턴을 활용하면 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할 수 있다.

 

오리들은 모두 CDuck을 확장해서 만들고, 나는 행동은 모두 CFlyBehavior를, 꽥꽥 소리를 내는 행동은 CQuackBehavior를 구현해서 만든다. 오리의 행동들을 일련의 행동으로 생각하는 대신, 알고리즘 군으로 생각한다면 똑같은 테크닉으로 다른 방법을 구현할 수 있다.

 

각 다이어그램을 구현해 보자.

///////////////////////////////////////////////////////////////////////////////////////////////////

class CFlyBehavior
{
public:
	virtual void fly() abstract;
};

class CFlyWithWings : public CFlyBehavior
{
	virtual void fly() override
	{
		cout << "날고 있어요!!" << endl;
	}
};

class CFlyNoWay : public CFlyBehavior
{
	virtual void fly() override
	{
		cout << "저는 못 날아요" << endl;
	}
};
///////////////////////////////////////////////////////////////////////////////////////////////////

class CQuackBehavior
{
public:
	virtual void quack() abstract;
};

class CQuack : public  CQuackBehavior
{
public:
	virtual void quack() override
	{
		cout << "꽥!" << endl;
	}
};

class CMuteQuack : public CQuackBehavior
{
public:
	virtual void quack() override
	{
		cout << "조용~" << endl;
	}
};

class CSqueak : public CQuackBehavior
{
public:
	virtual void quack() override
	{
		cout << "삑~!" << endl;
	}
};
///////////////////////////////////////////////////////////////////////////////////////////////////

class CDuck
{
public:
	unique_ptr<CQuackBehavior> quakeBehavior;
	unique_ptr<CFlyBehavior> flyBehavior;

	virtual void display() abstract;

	void performFly()
	{
		flyBehavior->fly();
	}
	void performQuack()
	{
		quakeBehavior->quack();
	}
	void swim()
	{

	}
};

class CMallardDuck : public CDuck
{
public:
	CMallardDuck()
	{
		quakeBehavior = make_unique<CQuack>();
		flyBehavior = make_unique<CFlyWithWings>();
	}

	void display()
	{
		cout << "저는 물오리입니다." << endl;
	}
};

이제 mallard duck에 대해 정의하고 실행해보자.

class CMiniDuckSimulator
{
	unique_ptr<CDuck> mallard;
public:
	CMiniDuckSimulator()
	{
		mallard = make_unique<CMallardDuck>();
		mallard->performFly();
		mallard->performQuack();
	}
};

int main()
{
	CMiniDuckSimulator miniDuck;

    return 0;
}

StrategyPattern.zip
0.01MB

 

728x90
반응형