0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【C++】TemplateMethod(デザインパターン)

Last updated at Posted at 2025-01-28

TemplateMethodとは?

アルゴリズムの骨組みを基底クラスで定義し、
具体的な処理をサブクラスに委譲する
ことで、
アルゴリズムの全体的な構造を保ちつつ、
部分的な処理をカスタマイズできる設計。

  • アルゴリズムの共通部分を基底クラスに集約することで、コードの重複を減らし、
    再利用性を高める
  • サブクラスで具体的な処理をオーバーライドすることで、柔軟性・拡張性が高くなる
  • 制御の反転が実現する

C++

TemplateMethod.cpp
#include <iostream>

/// <summary>
/// アルゴリズムの骨組み
/// </summary>
class AbstractClass
{
public:
    void TemplateMethod(void)
    {
        Step1();
        Step2();
        Step3();
    }

    inline virtual void Step1(void) = 0;
    inline virtual void Step2(void) = 0;
    inline virtual void Step3(void) = 0;
};

/// <summary>
/// 詳細A
/// </summary>
class ConcreteClassA
    : public AbstractClass
{
private:
    inline void Step1(void) override
    {
        std::cout << "上着を着る" << std::endl;
    }
    inline void Step2(void) override
    {
        std::cout << "手袋をはめる" << std::endl;
    }
    inline void Step3(void) override
    {
        std::cout << "スマホをポッケに入れる" << std::endl;
    }
};

/// <summary>
/// 詳細B
/// </summary>
class ConcreteClassB
    : public AbstractClass
{
private:
    inline void Step1(void) override
    {
        std::cout << "スマホをポッケに入れる" << std::endl;
    }
    inline void Step2(void) override
    {
        std::cout << "手袋をはめる" << std::endl;
    }
    inline void Step3(void) override
    {
        std::cout << "上着を着る" << std::endl;
    }
};

int main(void)
{
    ConcreteClassA patternA;
    ConcreteClassB patternB;

    patternA.TemplateMethod();
    patternB.TemplateMethod();

    return 0;
}

C#

TemplateMethod.cs
using System;

/// <summary>
/// アルゴリズムの骨組み
/// </summary>
public abstract class AbstractClass
{
    public void TemplateMethod()
    {
        Step1();
        Step2();
        Step3();
    }

    public abstract void Step1();
    public abstract void Step2();
    public abstract void Step3();
}

/// <summary>
/// 詳細A
/// </summary>
public class ConcreteClassA : AbstractClass
{
    public override void Step1()
    {
        Console.WriteLine("上着を着る");
    }

    public override void Step2()
    {
        Console.WriteLine("手袋をはめる");
    }

    public override void Step3()
    {
        Console.WriteLine("スマホをポッケに入れる");
    }
}

/// <summary>
/// 詳細B
/// </summary>
public class ConcreteClassB : AbstractClass
{
    public override void Step1()
    {
        Console.WriteLine("スマホをポッケに入れる");
    }

    public override void Step2()
    {
        Console.WriteLine("手袋をはめる");
    }

    public override void Step3()
    {
        Console.WriteLine("上着を着る");
    }
}

public class Program
{
    static void Main()
    {
        ConcreteClassA patternA = new ConcreteClassA();
        ConcreteClassB patternB = new ConcreteClassB();

        patternA.TemplateMethod();
        Console.WriteLine("");
        patternB.TemplateMethod();
    }
}
0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?