どこにテンプレートを使用方法パターン?
-
20-09-2019 - |
質問
誰でもできるので私の一例状況テンプレート式-パターンは何に使われるのでしょうか。
することで実世界での利用からご自身の経験です。
してくれてありがとうございますこれまでにいかがでしたかみのマッピングデータのダ層します。ん!!!)
解決
ただ一部の事例を取り上げて、共通状況テンプレート方式のパターンを使用すること。
いたい場合、プログラム"Open拡張"もの"閉じた変更は". この挙動のモジュールを拡張できるようにするという意味ではなく、モジュール行動とは異なった新たな方法としての要求事項アプリケーションに対する変更は、ニーズに対応して設立されました。しかし、ソースコードのようなモジュールはinviolate.ないが許容するソースコードを変更します。以下の例を追加することができます新しい方法での給与計算などの遠隔クラス)を変更せずに、以前のコードです。
public abstract class Salary { public final void calculate() { System.out.println("First shared tasks is done."); getBaseSalary(); System.out.println("Second shared tasks is done."); } public abstract void getBaseSalary(); } public class Hourly extends Salary { @Override public void getBaseSalary() { System.out.println("Special Task is done."); } } public class Test { public static void main(String[] args) { Salary salary = .... salary.calculate(); } }
が直面する多くの同ラインのコードが複製を通じて抽出する手法を一段階のアルゴリズムです。 きの実施コンテンツの方法では機能できる一部のコードとは異なるのがタイプ別タイプです。この部分が再定義または変更これらのセクションの方法や機能を変更せずに、アルゴリズムの方法や機能の主な構造です。例えばしたい場合はこの問題を解決するこのパターンですこのサンプル
function0:function1:...functionN:
1 1 1
2 2 2
... ... ...
5 6 n
3 3 3
4 4 4
... ... ...
ご覧のとおり、第cods5,6,nが異なりから一つの機能を次の関数として共有部分など1,2,3,4が重複しています。きを考慮ソリューションの一つで有名なjavaが書けます。
public abstract class InputStream implements Closeable {
public abstract int read() throws IOException;
public int read(byte b[], int off, int len) throws IOException {
....
int c = read();
....
}
....
}
public class ByteArrayInputStream extends InputStream {
...
public synchronized int read() {
return (pos < count) ? (buf[pos++] & 0xff) : -1;
}
...
}
きのデザイナーとしての枠組みをいただいているお客様だけの利用の実行コードを渡される引数としてお枠組みが期待される通りに面(実行する引数ですることができるものとします。 この実行が当面のとして同期型コールバックは、いといった事態も起こりかね間として非同期的なコールバック.きを考慮の有名です。
public abstract class HttpServlet extends GenericServlet implements java.io.Serializable { protected void doGet(HttpServletRequest req, HttpServletResponse resp) { ... } protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { .... doGet(req, resp); ... } ... } } public class MyServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //do something ... } ... }
他のヒント
A テンプレート方式のパターン 無骨格のために行うアルゴリズムまたは操作できるサブクラス再定義の論理です。
メリット:自然にフィットのための枠組み構築し、親会社の枠組みの授業できるコールバックの手法に実施されます。
例:
- java.util.作業量を最小限に抑え
- サーブレットのdoGetとdoPost方法
- MDBのonMessage方法
- Strutsアクションクラス
- 春のデータにアクセスの授業
連結:を制限する単一の遺産をJava.
への適用 テンプレート方法 パターンには二つの主要な特徴:
- ある基底クラス(Javaでは、一つだけで
protected
コンストラクタはオプションとして宣言されてabstract
)するサブクラス化クライアントのコードです。 - があり 両グループの方法 定義した基底クラス:a)一又は複 テンプレート方法 (通常は唯一、一つ以上の プリミティブ運用 方法(通常以上)してご利用いただけます。各テンプレート方法は、高レベルの運用、実施の基底クラス自体のプリミティブ事業として実施/オーバーライドそれぞれの特定のサブクラス.通常、テンプレートのメソッドはpublicと非overridable(
final
, は、Java);そのAPIドキュメンテーションを指定する必要精密にするプリミティブ操作方法では、時が誰でも簡単に行えます。を記載しなければならない"アルゴリズム").プリミティブ操作方法、ステップのアルゴリズムは非公開でoverridable(protected
, で、Java、きの二種類:a)抽象的な方法 必要 実施され、サブクラス;b)方法をデフォルトの空の実装する 月 するオーバーライドはサブクラス.
その一例は、Java6SDKは、 execute()
の方法 javax.swing.SwingWorker
クラスによるところが大きいと考えられ public final void
法です。この場合、プリミティブ操作方法 doInBackground()
, process(List)
, は、 done()
.初めて抽象的になるための実装をサブクラス;その名のテンプレート方法を背景にねじになります。その他について空の実装およびシフトオーバーライドはサブクラス;彼の実行時に呼び出され、処理の最後には、それぞれの米国東部夏時間のスイングイベントを派遣スレッドで、セキュリティーに関するUI.
自分の経験しているのにも用いられるこのパターンです。その一つでしたJavaベースを実装するクラスの java.util.Iterator
インタフェースが next()
したテンプレートの方法の一つが達成されたプリミティブ操作方法を担当スをインスタンス化特定のドメインのエンティティクラス(これを皮肉った内容なのですが、この場合の繰り返し処理を行リストの永続的なドメインの織物は、JDBC).より良い例と同じアプリケーションした基底クラスがテンプレートのメソッド実装の多段階的アルゴリズムを生成するための"事業者メンテナンス画面"を利用スイング)から与えられたリストの永続的なエンティティプリミティブ操作方法というのは、1)透明表示中の画面状態、2)を追加するテーブルビューの画面オプションとして、その他のプリミティブ事業からのテンプレート法の場合、画面が自由に編集できます。
最後になると思われるが、確かに有用なデザインパターンではなく、その場所であることが発表されます。るだけで、基底クラスの方法がオーバーライドクラスのサブクラス(より共通状況を、私の経験では十分ではなく、自象の応用としてのパターンです。
テンプレートメソッドの中で最も重要なことは、あなたが手順やアルゴリズムなどの抽象メソッドのシリーズを定義し、これらのメソッドのための具体的な実装とサブクラスの代替をさせなければならないことです。
私は、ドキュメント生成プログラムの一つに適用されます。
public abstract DocumentGenerator()
{
generateHeader();
generateBody();
generateDetails();
}
public HTMLDocGenerator : DocumentGenerator()
{
public override generateBody()
{
//generate as in html format
}
}
。( - >ヘッダ、ボディ、詳細生成) このあなたはPDFジェネレータのcsvジェネレータと、ここで値などのさまざまな実装が、彼らはアルゴリズムにcomformであることができます
テンプレートパターンを使用すべきです。アルゴリズムは、基本クラスの関数で定義され、実装は、基本クラスおよびサブクラスによって行われます。リアルタイム例の詳細な説明は http://preciselyconcise.com/design_patterns/templatemethod.phpに与えられていますの
私はいくつかのテンプレートメソッドを使用する1つの実世界の例をスケッチします。
は、C ++コンピュータビジョンアルゴリズムのアプリケーションでは、アルゴリズムの動作は、起動時にロードされた設定ファイルに押し込め列挙型に応じて、実行時に読んでいくつかのオプションに基づいてアルゴリズムの動作の味のカップルを想定して設計されました。アルゴリズムの全体的な骨組みはそう残酷にちょうどそのレベルで異なる機能を呼び出すために複製されることになるコードの同じ部分であるものの真ん中に詰め、いくつかのキーのコールバックを除いて同一でした。私が使用していたこれらのコールバックは、テンプレートメソッドの基底クラスに抽象化し、テンプレートメソッドパターンは、すべてそのコードの重複を防ぎます。私たちは基本的に私は行動の味のそれに関連するビットをを指すので、アルゴリズムを貸すために私の基本クラスのポインタをインスタンス化するものサブクラスます。
口述使われる列挙今すぐ実行しているアルゴリズムの味のこの品種の背後にある動機の一部は、私たちの機器を制御するソフトウェアのオフライン機能VSオンラインでした。オフライン味はそれでより豊かなデバッグ/診断出力を引っ張り、オンライン味は絶対座標空間で物事を維持し、実行しているすべてのロボット工学と楽器とどのようなしないように、特定の懸念を維持しながら、いくつかの画像のピクセルへのローカル座標系を保ちました。別の列挙型は、そうでない場合は、コードの体を介して同じように流れたが、どのようにするためのいくつかの統治の条件に基づいて異なって解釈するために必要なさまざまな分類が異なるデータセットの下で訓練されたので、我々は同様に、いくつかの機械学習に使用する分類器のセットの中の選択を運転しましたそのデータが作成されました。
私は、ユースケースのこの種のは、私は<のhref = "http://blog.enfranchisedmind.com/2007/07/the-hole-in-the-middle-pattern/と呼ばれているものから生じたと考えています"REL =" "nofollowを>中間の問題に穴
Iコンポーネントの数は、同じプロセスを共有したが、実装がわずかに異なっていたビジネスロジックのテンプレート方法を使用しています。
テンプレート方法は、アルゴリズムの骨格構造を定義するが、 サブクラスに特定のステップと詳細を延期します。構造と アルゴリズムの流れは静止したまま、しかしステップの詳細は、 サブクラスに延期ます。
私は、ドキュメントのコンテンツを準備するためにTemplate Methodパターンを使用しました。各タイプには独自の小さな変更を持つ文書の多くの異なる種類がありました。しかし、文書作成の主なプロセスは、すべて同じでした。