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;
}
728x90
반응형
'소프트웨어 공부 > 디자인패턴' 카테고리의 다른 글
싱글턴 패턴(Singleton Pattern) (0) | 2022.04.28 |
---|---|
팩토리 패턴(Factory Pattern) (0) | 2022.04.07 |
데코레이터 패턴(Decorator Pattern) (0) | 2022.04.06 |
옵저버 패턴(Observer Pattern) (0) | 2022.04.05 |