Template_Method_Pattern_2 - 8BitsCoding/RobotMentor GitHub Wiki

목차

Template Method : Allow us to define the 'skeleton' of the algorithm, with concrete implementations defined in subclasses.


Template Method

class Game
{
public:
    Game(int number_of_players) : number_of_players(number_of_players) {}

    void run()
    {
        start();
        while(!have_winner())
            take_turn();
        cout << "Player " << get_winner() << " wins\n";
    }

protected:
    virtual void start() = 0;
    virtual void have_winner() = 0;
    virtual void take_turn() = 0;
    virtual void get_winner() = 0;

    int current_player{0};
    int number_of_players;
};

class Chess : public Game
{
public:
    Chess() : Game(2) {}

protected:
    void start() override
    {
        // Do something
    }

    void have_winner() override
    {
        // Do something
    }

    void take_turn() override
    {
        // Do something
    }

    void get_winner() override
    {
        // Do something
    }
};

int main()
{
    Chess chess;
	chess.run();
    
    return 0;
}

Template Method 전체코드

#include <iostream>
#include <string>
using namespace std;

class Game
{
public:
	explicit Game(int number_of_players)
		: number_of_players(number_of_players)
	{
	}

	void run()
	{
		start();
		while (!have_winner())
			take_turn();
		cout << "Player " << get_winner() << " wins.\n";
	}

protected:
	virtual void start() = 0;
	virtual bool have_winner() = 0;
	virtual void take_turn() = 0;
	virtual int get_winner() = 0;

	int current_player{ 0 };
	int number_of_players;
};

class Chess : public Game
{
public:
	explicit Chess() : Game{ 2 } {}

protected:
	void start() override
	{
		cout << "Starting a game of chess with " << number_of_players << " players\n";
	}

	bool have_winner() override
	{
		return turns == max_turns;
	}

	void take_turn() override
	{
		cout << "Turn " << turns << " taken by player " << current_player << "\n";
		turns++;
		current_player = (current_player + 1) % number_of_players;
	}

	int get_winner() override
	{
		return current_player;
	}

private:
	int turns{ 0 }, max_turns{ 10 };
};

int main()
{
	Chess chess;
	chess.run();

	getchar();
	return 0;
}
⚠️ **GitHub.com Fallback** ⚠️