TemplateMethod パターン

本文介绍模板方法设计模式,通过一个木版画制作的教学案例,详细解释了如何在超类定义处理流程骨架,并允许子类实现具体步骤。此模式确保一致的行为流程,同时保持灵活性。

转自:http://www.techscore.com/tech/DesignPattern/TemplateMethod.html

 

 

第3章では TemplateMethod パターンを紹介します。 template とは、文字の形に穴があいている薄いプラスチックの板のことです。その穴をペンでなぞると、手書きでも整った文字を書くことができます。しかし、マジックで書くのか、鉛筆で書くのか、それとも墨汁と筆を使ってみるのかということを考えてみると、実際にどのような文字になるのかはわかりません。template は、ただその形を決定する枠組みを提供するだけです。

TemplareMethod パターンは、テンプレートの機能を持つパターンです。スーパークラスで処理の枠組みを定め、サブクラスでその具体的内容を実装します。スーパークラスでは、アルゴリズムの流れの中で利用される抽象的なメソッドと、この抽象的なメソッドを利用して、処理のアルゴリズムを定義する templateMethod メソッドを定義します。

 

 

 

今回は、生徒たちに木版画を教えます。簡単に大まかな流れを教えて、細かいことは生徒が自分で考えてやってもらうことにしました。木版画の作り方は、次のようになります。

  1. 版材を用意する
  2. 版材となる板に絵を描く
  3. 絵にあわせて版材を彫る
  4. プリントする

これをプログラムに書いてみましょう。

public abstract class WoodCutPrint{
	public abstract void draw( Cuttable hanzai );
	public abstract void cut( Cuttable hanzai );
	public abstract void print( Cuttable hanzai );
	public void createWoodCutPrint(){
		Wood hanzai = new Wood(); //Wood クラスは、Cuttable インタフェースを実装している
		draw( hanzai );
		cut( hanzai );
		print( hanzai );
	}
}

これでテンプレートは完成です。テンプレートとなる WoodCutPrint クラスでは、抽象メソッドである draw メソッド、 cut メソッド、print メソッド 定義しています。createWoodCutPrint メソッドでは、「版材」となる Cuttable インタフェースを実装 hanzai インスタンスを生成し、自らのクラスで定義している抽象メソッドを利用して、処理の流れを記述しています。どのように絵を描いて、どのように彫って、どのようにうプリントするのかは、すべてこれを継承するサブクラスの実装に任せられます。では、サブクラスはどのようになるでしょうか?田中君の木版画は以下のように作られるようです。

public class TanakasWoodCutPrint extends WoodCutPrint{
	public void draw( Cuttable hanzai ){
		hanzai にマジックを使って大好きな女の子の絵を描く;
	}
	public void cut( Cuttable hanzai ){
		彫刻刀を使って細部まで丁寧に hanzai を彫る;
	}
	public void print( Cuttable hanzai ){
		版画インクと馬簾を使って豪快にプリントする;
	}
}

このように、TemplateMethod パターンでは、処理のアルゴリズムのみを定め、その処理の具体的な実装は、そのサブクラスに任せています。処理の大枠の手順に変更がない場合 TemplateMethod パターンの利用価値が高くなります。 サンプルケースのクラス図を見てみましょう。

サンプルケースのクラス図

TanakasWoodCutPrint クラスのインスタンスの createWoodCutPrint メソッドを呼び出せば、TanakasWoodCutPrint クラスで用意されている draw 、cut 、print の各メソッドが呼び出されます。

TemplateMethod パターンを利用することで、クラスの全員が間違いなく木版画を作成することができます。もし、処理の流れをテンプレートにせず、 SomeonesWoodCutPrint クラスの中に記述していたらどんなことになるでしょう?クラスの全員がきちんとした流れに沿って木版画を作成できていたでしょうか?今回のような簡単な流れしかなければ、たいした問題も生じないかもしれませんが、もっと複雑な処理を行う必要があった場合、処理の流れを間違ってしまう生徒が出ていたかもしれませんね。

 

 

 

 

TemplateMethod パターンの典型的なクラス図は以下のようになります。

TemplateMethod パターンの典型的なクラス図
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值