Visitor Pattern
Example of Strategy Pattern Fighter
Weapon Behavior Header (WeaponBehavior.h)
#ifndef WEAPONBEHAVIOR_H_
#define WEAPONBEHAVIOR_H_
class WeaponBehavior
{
public:
virtual ~WeaponBehavior() {}
virtual void useWeapon() = 0;
};
#endif
Weapons
Axe Header (AxeBehavior.h)
#ifndef AXEBEHAVIOR_H_
#define AXEBEHAVIOR_H_
#include "WeaponBehavior.h"
class AxeBehavior: public WeaponBehavior {
public:
AxeBehavior();
virtual ~AxeBehavior();
virtual void useWeapon();
};
#endif
Axe Behavior (AxeBehavior.cpp)
#include "AxeBehavior.h"
#include <iostream>
AxeBehavior::AxeBehavior() {}
AxeBehavior::~AxeBehavior() {}
void AxeBehavior::useWeapon()
{
std::cout << "I am using my Axe! " << std::endl;
}
Gun Behavior Header (GunBehavior.h)
#ifndef GUNBEHAVIOR_H_
#define GUNBEHAVIOR_H_
#include "WeaponBehavior.h"
class GunBehavior: public WeaponBehavior {
public:
GunBehavior();
virtual ~GunBehavior();
virtual void useWeapon();
};
#endif
Gun Behavior (GunBehavior.cpp)
#include "GunBehavior.h"
#include <iostream>
GunBehavior::GunBehavior() {}
GunBehavior::~GunBehavior() {}
void GunBehavior::useWeapon()
{
std::cout << "I am using my Gun! " << std::endl;
}
Knife Behavior Header (KnifeBehavior.h)
#ifndef KNIFE_H_
#define KNIFE_H_
#include "WeaponBehavior.h"
class Knife: public WeaponBehavior {
public:
Knife();
virtual ~Knife();
virtual void useWeapon();
};
#endif
Knife Behavior (KnifeBehavior.cpp)
#include "Knife.h"
#include <iostream>
Knife::Knife() {}
Knife::~Knife() {}
void Knife::useWeapon()
{
std::cout << "I am using my knife! " << std::endl;
}
Now for the Character that will use Weapon Behavior
Character File Header (Character.h)
#ifndef CHARACTER_H_
#define CHARACTER_H_
#include <string>
class WeaponBehavior;
class Character {
public:
Character(std::string name, WeaponBehavior * weaponBehavior);
virtual ~Character();
virtual void Fight();
virtual void SetWeaponBehavior(WeaponBehavior * weaponBehavior)
{
m_pWeaponBehavior = weaponBehavior;
}
protected:
WeaponBehavior * m_pWeaponBehavior;
std::string m_name;
};
#endif
Character File (Character.cpp)
#include "Character.h"
#include "WeaponBehavior.h"
#include <string>
#include <iostream>
Character::Character(std::string name, WeaponBehavior * weaponBehavior) : m_pWeaponBehavior(weaponBehavior), m_name(name){}
Character::~Character() {};
void Character::Fight()
{
std::cout << m_name << ": ";
m_pWeaponBehavior->useWeapon();
}
Main File (main.cpp)
#include <string>
#include "AxeBehavior.h"
#include "GunBehavior.h"
#include "Knife.h"
#include "Character.h"
int main()
{
WeaponBehavior * axeBehavior = new AxeBehavior();
WeaponBehavior * gunBehavior = new GunBehavior();
WeaponBehavior * knifeBehavior = new Knife();
Character * Aaron = new Character(std::string("Aaron Shreck"), axeBehavior);
Character * Austin = new Character(std::string("Austin Harms"), gunBehavior);
Character * Chris = new Character(std::string("Chris Hanke"),axeBehavior);
Character * Devin = new Character(std::string("Devin Powers"), knifeBehavior);
Devin->SetWeaponBehavior(knifeBehavior);
Devin->Fight();
Aaron->SetWeaponBehavior(axeBehavior);
Austin->SetWeaponBehavior(gunBehavior);
Chris->SetWeaponBehavior(axeBehavior);
Aaron->Fight();
Austin->Fight();
Chris->Fight();
// Can Change Weapon Behavior Easily
Aaron->SetWeaponBehavior(gunBehavior);
Austin->SetWeaponBehavior(knifeBehavior);
Chris->SetWeaponBehavior(knifeBehavior);
Devin->SetWeaponBehavior(axeBehavior);
Aaron->Fight();
Austin->Fight();
Chris->Fight();
Devin->Fight();
delete Aaron;
delete Austin;
delete Chris;
delete Devin;
delete axeBehavior;
delete gunBehavior;
delete knifeBehavior;
}
Output:
Devin Powers: I am using my knife!
Aaron Shreck: I am using my Axe!
Austin Harms: I am using my Gun!
Chris Hanke: I am using my Axe!
Aaron Shreck: I am using my Gun!
Austin Harms: I am using my knife!
Chris Hanke: I am using my knife!
Devin Powers: I am using my Axe!