Visitor Pattern

inserting an Image inserting an Image inserting an Image

Example of Strategy Pattern Fighter

inserting an Image inserting an Image

Weapon Behavior Header (WeaponBehavior.h)

#ifndef WEAPONBEHAVIOR_H_
#define WEAPONBEHAVIOR_H_

class WeaponBehavior
{
public:
	virtual ~WeaponBehavior() {}
	virtual void useWeapon() = 0;
};


#endif

Weapons

inserting an Image

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

inserting an Image

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();
}

inserting an Image

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!