てぃぐれのプログラマwiki

ワクワクに従う

テンプレートメソッド 【デザインパターン】

テンプレートメソッド

複数のメソッドの流れを抽象化し、メソッドの中身はサブクラスで実装する。

 

メリット

テンプレートを増やしたいときは、クラスを増やせばいいので、コードがタコ足配線にならなくて良い。

もし、テンプレートメソッドがなかったら、if文で分岐して、、みたいになって行くことだろう。

 

クラス図

f:id:tigretic:20220317025213j:plain

 

サンプルコード

using System;

namespace templateMethod
{
class Program
{
static void Main(string[] args)
{

CustomerMail mail = new CustomerMail("ティグレ","好きです。");
mail.makeMailtext();

StudentMail mail2 = new StudentMail("アイリさん", "付き合ってください。");
mail2.makeMailtext();
}
}

abstract public class MailCreator
{
internal String name;
internal String text;

public void makeMailtext()
{
Console.WriteLine(this.header() + "\n\n" + this.body() + "\n\n" + this.footer());
}
abstract protected String header();
abstract protected String body();
abstract protected String footer();
}
 
//テンプレート1
public class CustomerMail : MailCreator
{
public CustomerMail(String name, String text)
{
this.name = name;
this.text = text;
}

protected override String header()
{
return this.name + '様';
}

protected override String body()
{
return "いつもありがとうございます。\n" + this.text;
}

protected override String footer()
{
return "=======\nティグレ株式会社\n" + "0120-0000-0000\n" + "=====\n";
}
}
 
 // テンプレート2
public class StudentMail : MailCreator
{
public StudentMail(String name, String text)
{
this.name = name;
this.text = text;
}

protected override String header()
{
return this.name + '殿';
}

protected override String body()
{
return "お元気でしょうか。\n" + this.text;
}

protected override String footer()
{
return "=======\nティグレ株式会社\n" + "0120-0000-0001\n" + "=====\n";
}
}
}

結果

ティグレ様

いつもありがとうございます。
好きです。

=======
ティグレ株式会社
0120-0000-0000


お元気でしょうか。
付き合ってください。

=======
ティグレ株式会社
0120-0000-0001