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