設計モード(8)テンプレート方法(説明+応用)
3090 ワード
目次テンプレートメソッド テンプレートメソッド を使用する理由テンプレートメソッド適用例 テンプレートメソッド
テンプレートメソッド:1つのメソッドでアルゴリズムのフレームワークを定義し、そのメソッドのいくつかのステップをサブクラスに遅延させ、アルゴリズムを変更せずに独自のアルゴリズムを再定義します.
テンプレートメソッドの定義を見ると、ポリシーモードと何の違いもなく、アルゴリズムのパッケージ化されているような気がしますが、その違いはどこにありますか?
違い:ポリシーモードは複数のクラスのメソッドを組み合わせた方法で組み合わせられ、テンプレートメソッドは継承によって実現されます.すなわち、親クラスにfinalの修正不可能なメソッドがあり、私たちのアルゴリズムロジックを書き込んで、その組み合わせのアルゴリズムはそのサブクラスの中で具体的に実際の状況に基づいて定義することができます.
なぜテンプレートメソッドを使うのか
今、私たちは1つの流水ラインを実現しなければなりません.この流水ラインでは、私たちが生産した機械を実現することができます.これらの機械の構成にはいくつかの違いがあります.もし機械の種類が多くなければ、私たちはすべての機械に対して流水ラインを作ることができますが、もし機械の種類が多くて、もしこれらの機械の出荷時間が異なるならば、最初の出荷が終わったら、この機械の生産ラインは放置され、利用率が低くなります.このように類比して、もし私たちが機種ごとにクラスを作成すれば、私たちのコードが肥大化し、多くの重複コードが存在し、設計モデルの基本原則に基づいて、変わらない抽出を行い、変化した部分をパッケージ化する必要があります.これにより、コードをより簡潔にし、後期のメンテナンスコストを削減できます.だから私たちはこう書くことができます
上記の注釈のあるところはここでくどくどしないで、前編の終わりの時に次のフックの方法について話します.ここで、ここの豆の方法はifDressup()です.フックの方法がなければ、私たちの組み立てアルゴリズムの論理は親の中でfinalで、私たちはそれをコントロールすることができません.そのため、柔軟性を失いました.もちろん、サブクラスで制御することを望んでいます.これにより、この組立プロセスをより柔軟に制御することができます.そのため、フックメソッドが発生し、フックメソッドによってサブクラスと親クラスを連結し、テンプレートメソッドではフックメソッドを組立条件として使用します.そして私たちのサブクラスでは、私たち自身の要求に基づいてこの方法を上書きします.、
テンプレートメソッド適用例
現実には、どんな例がありますか?見ていると、何かを思い出すことができるはずですが、私たちが開発しているviewの多くは、このような方法で行われています.Androidでのviewを例に
Viewクラス
上記の例では、viewコントロールの描画の流れを見ることができます.
次回は工場モードを更新しますが、これは当時見たときに一番ぼんやりしていたものです.
テンプレートメソッド:1つのメソッドでアルゴリズムのフレームワークを定義し、そのメソッドのいくつかのステップをサブクラスに遅延させ、アルゴリズムを変更せずに独自のアルゴリズムを再定義します.
テンプレートメソッドの定義を見ると、ポリシーモードと何の違いもなく、アルゴリズムのパッケージ化されているような気がしますが、その違いはどこにありますか?
違い:ポリシーモードは複数のクラスのメソッドを組み合わせた方法で組み合わせられ、テンプレートメソッドは継承によって実現されます.すなわち、親クラスにfinalの修正不可能なメソッドがあり、私たちのアルゴリズムロジックを書き込んで、その組み合わせのアルゴリズムはそのサブクラスの中で具体的に実際の状況に基づいて定義することができます.
なぜテンプレートメソッドを使うのか
今、私たちは1つの流水ラインを実現しなければなりません.この流水ラインでは、私たちが生産した機械を実現することができます.これらの機械の構成にはいくつかの違いがあります.もし機械の種類が多くなければ、私たちはすべての機械に対して流水ラインを作ることができますが、もし機械の種類が多くて、もしこれらの機械の出荷時間が異なるならば、最初の出荷が終わったら、この機械の生産ラインは放置され、利用率が低くなります.このように類比して、もし私たちが機種ごとにクラスを作成すれば、私たちのコードが肥大化し、多くの重複コードが存在し、設計モデルの基本原則に基づいて、変わらない抽出を行い、変化した部分をパッケージ化する必要があります.これにより、コードをより簡潔にし、後期のメンテナンスコストを削減できます.だから私たちはこう書くことができます
//
public abstract class Machine{
// ,final ,
final void produce(){
createFrame();
addHead();
addBody();
if(ifDressup())
dressUp();
}
//
public abstract void createFrame();
//
public abstract void addHead();
//
public abstract void addBody();
//
public abstract void dressUp();
//
public boolean ifDressup(){
return true;
}
}
//
public class InflatableDoll{
public void createFrame(){
System.out.println("This is a Frame");
}
public void addBody(){
System.out.println("This is a body");
}
public void dressUp(){
System.out.println("This is a beautiful cloth");
}
}
上記の注釈のあるところはここでくどくどしないで、前編の終わりの時に次のフックの方法について話します.ここで、ここの豆の方法はifDressup()です.フックの方法がなければ、私たちの組み立てアルゴリズムの論理は親の中でfinalで、私たちはそれをコントロールすることができません.そのため、柔軟性を失いました.もちろん、サブクラスで制御することを望んでいます.これにより、この組立プロセスをより柔軟に制御することができます.そのため、フックメソッドが発生し、フックメソッドによってサブクラスと親クラスを連結し、テンプレートメソッドではフックメソッドを組立条件として使用します.そして私たちのサブクラスでは、私たち自身の要求に基づいてこの方法を上書きします.、
テンプレートメソッド適用例
現実には、どんな例がありますか?見ていると、何かを思い出すことができるはずですが、私たちが開発しているviewの多くは、このような方法で行われています.Androidでのviewを例に
public class View{
/**
* ,
*/
protected void onDraw(Canvas canvas) {
}
/**
* ,
*/
protected void dispatchDraw(Canvas canvas) {
}
//
public void draw(Canvas canvas) {
if (!verticalEdges && !horizontalEdges) {
// 1
if (!dirtyOpaque) onDraw(canvas);
// 2
dispatchDraw(canvas);
// 3
onDrawScrollBars(canvas);
return;
}
}
//... ...
}
Viewクラス
public class MyView extends View {
public MyView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
}
@Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
}
}
上記の例では、viewコントロールの描画の流れを見ることができます.
次回は工場モードを更新しますが、これは当時見たときに一番ぼんやりしていたものです.