-
객체 행동 : 전략 패턴 ( Strategy Pattern ) - 정책(Policy)Programming/패턴 2020. 5. 4. 18:05
GOF의 디자인 패턴을 참고하여 작성을 합니다.
객체 행동에 대한 패턴 중 하나
정의
- 각 알고리즘을 캡슐화하여, 이들을 상호교환이 가능하도록 만드는 패턴 중 하나이다.
- 알고리즘을 사용하는 클라이언트와 상관없이 독립적으로 알고리즘을 다양하게 변경할 수 있다.
동기
- 특정 알고리즘에 대한 함수 및 기능은 다양하지만, 클래스에서 직접 하드코딩하는 것은 아래과 같은 이유로 별로다.
- 코드 크기에 대한 문제
- 모든 알고리즘을 제공하기가 힘듦
- 다양화하기가 힘듦
구조
- Composition 클래스는 특정 기능에 대한 유지 및 수정에 대한 책임이 있다고 하면, Composition 클래스 자체에서 구현하지 않음.
- Composition 객체는 Compositor 객체에 대한 참조자를 유지하고 관리한다고 봐야한다.
- 실제 구현이 되는 부분은 Compositor 인터페이스의 클래스들이라고 봐야한다. ( ConcreateStrategyA, B, C )
나름대로 구현
- attack 및 name 에 대한 알고리즘이 있다고 가정을 하자.
#include <iostream> using namespace std; class Weapon { public: virtual void attack() = 0; virtual void name() = 0; Weapon() { cout << "Weapon Constructing" << endl; } ~Weapon() { cout << "Weapon Constructing" << endl; } }; class Knife : public Weapon { public: Knife() { cout << "Knife Constructing" << endl; } ~Knife() { cout << "Knife Destructing" << endl; } virtual void attack() override { cout << "Knife attack" << endl; } virtual void name() override { cout << "This is MK2" << endl; } }; class K2 : public Weapon { public: K2() { cout<< "K2 Constructing" << endl; } ~K2() { cout << "K2 Destucting" << endl; } virtual void attack() override { cout << "K2 attack" << endl; } virtual void name() override { cout << "This is K2" << endl; } }; class WeaponAdmin { public: WeaponAdmin():_Weapon(0){} void Strategy(Weapon* pWeapon) { _Weapon = pWeapon; } void Interfaces() { _Weapon->attack(); _Weapon->name(); } private: Weapon* _Weapon; }; int main(int argc, const char * argv[]) { WeaponAdmin* KnifeSoldier = new WeaponAdmin(); KnifeSoldier->Strategy(new Knife); KnifeSoldier->Interfaces(); KnifeSoldier->Strategy(new K2); KnifeSoldier->Interfaces(); delete KnifeSoldier; return 0; }
코드 결과
Weapon Constructing Knife Constructing Knife attack This is MK2 Weapon Constructing K2 Constructing K2 attack This is K2 Program ended with exit code: 0
반응형'Programming > 패턴' 카테고리의 다른 글
객체 생성 : 프로토타입 패턴 ( Prototype Pattern ) (0) 2020.09.26 UML 관계 종류 (0) 2020.09.22 객체 생성 : 빌더 패턴 ( Builder Pattern ) (0) 2020.09.22 객체 생성 : 추상 팩토리 패턴 ( Abstract Factory Pattern ) (0) 2020.09.04 객체 생성 : 싱글턴 패턴 ( Singleton Pattern ) (0) 2020.05.04