問題タブ [template-method-pattern]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
584 参照

java - 抽象クラスと Template Method パターンと HttpServlet

HttpServletキーワードabstractで宣言された抽象クラスには 、抽象メソッドはありません。doGetその他は抽象メソッドではありません。では、なぜHttpServlet抽象クラスなしで抽象クラスとして宣言されるのでしょうか?

HttpServletテンプレートメソッドパターンの例ですか?

テンプレートパターンとテンプレートメソッドパターンとは?違いは何ですか?

0 投票する
1 に答える
2844 参照

c++ - ファクトリを使用するときにコンストラクタを「非表示」にする方法は?

コンストラクターから仮想メソッドを呼び出したいという状況に直面しています。もちろん、これは不可能です (または、少なくとも目的の動作が得られません)。この回答では、回避策としてファクトリ メソッドを使用することが提案されています。私はこのようなものを書きました:

テンプレートメソッドのパターンの一種です。各派生クラスは、構築方法をカスタマイズできます。ただし、この構造体全体が意味をなすのは、このクラスのユーザーがコンストラクターまたはafterConstruction()直接呼び出すことができない場合のみです。したがって、私はそれらの両方を非公開にしたいと思います。多分それはばかげた質問であり、私には明白なことがわからないだけです。友情などを使ってこれを達成できるかもしれませんが、これが最善の方法かどうかはわかりません. この 2 つのメソッドを非表示にして、ファクトリ メソッドを介したオブジェクトの作成のみを許可する、すてきでクリーンな方法は何ですか?

編集:Ka7Im1011 私が何を求めているのかがはっきりしていないことに気づきました。したがって、私は明確にしようとします:

他の人が派生しなければならない基本クラスを書きたいと思います。派生オブジェクトの構築には、基本クラスから除外したい非常に特殊なものが含まれます。Web で仮想コンストラクターを検索すると、上記の Q&A が見つかりました。ファクトリ アプローチがうまく機能すると思います。ただし、次のことを達成する方法がわかりません。

  • ファクトリから Derived のインスタンスを作成することだけが可能であるべきです。そうしないと、派生オブジェクトが一貫性のない状態で作成される可能性があります。(基本クラスだけではこれを強制することはできないと思いますが、Derived の各コーダーにコンストラクターを非公開/保護するように依頼するだけで十分です。)
  • 可能であれば、Derived は Base の純粋な仮想メソッドのみを実装する必要があります。これは、Derived を作成するのが非常に快適であるためです (IDE/コンパイラは、テンプレートのインターフェースなどの場合の冗長で時々不可解なエラー メッセージとは対照的に、実装する必要があるものを正確に通知します)。パラメータを実装する必要があります)
0 投票する
2 に答える
189 参照

ruby - Rspec:テンプレートメソッドパターンを適切にテストするには?

テンプレート メソッド デザイン パターンを使用する 2 つのクラスがあるとします。

Rspecでこれをテストする適切な方法は何ですか? このように作成してから、両方のクラスでshared_examples_for "a parent"使用してテストする必要がありますか?:it_should_behave_like 'a parent'

それともChild、親であることをテストし、それが上書きするフックメソッドのみをテストする必要がありますか?

0 投票する
1 に答える
79 参照

design-patterns - Template Method パターンの実装に複数のテンプレート メソッドを含めることはできますか?

テンプレート メソッド パターンの実装の抽象クラスは、複数のテンプレート メソッドを持つことができますか?

0 投票する
3 に答える
4086 参照

java - JdbcTemplate が Template メソッド設計パターンの例である理由

SOに関するこの質問に注意を引いたとき、私はデザインパターン、特にテンプレートメソッドについて読んでいました。

説明と特定のコードを読んだ後でも、なぜこれが「テンプレート メソッド」デザイン パターンの例なのか疑問に思っています。

GoF によると、このパターンの意図は次のとおりです。

「いくつかのステップをサブクラスに任せて、操作でアルゴリズムのスケルトンを定義します。テンプレート メソッドを使用すると、アルゴリズムの構造を変更することなく、サブクラスでアルゴリズムの特定のステップを再定義できます。」</p>

2 人の参加者がいます。

AbstractClass :
- 具体的なサブクラスがアルゴリズムのステップを実装するために定義する抽象プリミティブ操作を定義します
- アルゴリズムのスケルトンを定義するテンプレート メソッドを実装します。テンプレート メソッドは、AbstractClass で定義された操作や他のオブジェクトの操作だけでなく、プリミティブ操作も呼び出します。
ConcreteClass :
アルゴリズムのサブクラス固有のステップを実行するためのプリミティブ操作を実装します。


「JdbcOperations」のコードが「テンプレート メソッド」設計パターンと見なされるのはなぜですか?

  • 「JmsTemplate」などの同様のファイルのコードと比較しても、「グローバル/一般」アルゴリズムがスーパー/抽象クラスで定義されていることはわかりません。
  • 具象クラスに実装されている関数は、スーパー クラスでも定義されていません。定義されたすべてのメソッドは、インターフェース (この場合はインターフェース「JdbcOperations」) を使用して追加されますが、親のメソッドを実際にオーバーライドするものはありません。

ボイラープレート コードを削除するのに非常に便利で あることがわかりました。しかし、なぜこれは単なる気の利いたコーディング トリックではなく、テンプレート メソッドなのでしょうか。私には、テンプレート メソッドが持つ特性を共有していないように見えます。

0 投票する
0 に答える
256 参照

python - テンプレートメソッドパターンを機能的なスタイルに置き換えるには?

ここでコードを見ることができます

私が解決しようとしている具体的な問題はこれです。データベースに保存されたツールを使用して、モデル化されたエンティティ (私の場合は sqlalchemy) に REST インターフェイスを提供する必要があるとします。このコレクションを親と呼ぶとします。

このようなハンドラーが必要です

概念的には、このハンドラーはすべて非常に似ています。それらはすべて URL から ID を取得し、適切なクエリを作成します。次に、そのクエリでデータを取得し、このデータを dict に変換してから、呼び出しjsonifyて正しい http 応答を作成します。

したがって、OOP を使用すると、このように設計できます。

仕様は、いくつかのパラメーターとクエリを受け取り、このパラメーターに基づいてより洗練されたクエリを生成する関数です。

たとえば、GET /parents?spec={'name': 'by_name', 'args': ['adam'} は、コレクションから Adam という名前の親を返します。

このコードにはいくつかの欠陥がありますが、テンプレート メソッドがここで制御の流れを作る方法と、サブクラスがクエリの作成方法、データのフェッチ方法を変更できることを理解していただければ幸いです (アイテム ハンドラーは query.one() とコレクション ハンドラーを呼び出す必要があります)。たとえば、 query.all() を呼び出す必要があります)

そのため、代わりに create_query、fetch_data を依存性注入に置き換えることができます。しかし、それは誰かが間違った依存関係を与えることによって間違った設定を作成する可能性があるという問題を引き起こします. それは基本的に私が行ったことですが、代わりに部分関数を使用しています。

したがって、私が今考えているのは、ハンドラーに適切な依存関係を与える、必要なすべてのタイプのハンドラーのファクトリー関数を作成することで、この問題を解決できるということです。

それは私が思うテンプレートメソッドソリューションと非常によく似ています。基本的な違いは、テンプレート メソッドの正確さの依存関係はオブジェクト タイプによって保証され、私のソリューションではファクトリ関数のタイプによって保証されることです。

私の考えはここまでにして、あなたがそれについてどう思うか知りたいのですが?機能的な世界の人々は、この種の問題をどのように解決するのでしょうか?

0 投票する
2 に答える
800 参照

java - JDK のテンプレート デザイン パターンで、順番に実行される一連のメソッドを定義するメソッドが見つかりませんでした

について読んでいTemplate design patternます。私の現在の理解によると、順番に実行される一連のプロセス(メソッド)が定義されたアルゴリズムがある場合、テンプレートデザインパターンを使用できます。主なプレーヤーは

1.プロセス (メソッド) と実行順序の定義Abstract Template classを提供します。template method通常、このメソッドは最終的なものになるため、その動作は変更されません。テンプレート メソッドで言及されているプロセス (メソッド) のいくつかはデフォルトの実装で提供され、Abstract テンプレート クラス タイプを拡張する具象クラスに依存するその他のプロセスは抽象として残されます。

2. Concrete classes extending the Template method. これらは、必要に応じてデフォルトのメソッドをオーバーライドし、Abstract Template クラスで定義された抽象メソッドの実装を提供します。

JDKでの実装を検索してみましたjava.io。これらのクラスがこのパターンを実装していることを読んだ後、クラスを調べました。一連のプロセス (メソッド) と実行順序を定義するメソッドを見つけることができませんでした。

貴重な情報を提供してください。

0 投票する
3 に答える
86 参照

java - スーパークラスからのみアクセス可能なメソッド (C++ およびその他の言語)

public テンプレート メソッドを提供するスーパー クラスがあるとします。サブクラスは、いくつかのサブ操作を実装する必要があります。このサブオペレーションを からのみ呼び出すことができるように宣言するにはどうすればよいSuperClassですか? がありますがprotected、私が知る限り、それは逆に機能します。サブクラスは、保護されたスーパークラスのメンバーにアクセスできます。スーパークラス (およびスーパークラスのみ!) がサブクラス メンバーを呼び出せるようにしたいと考えています。

私は現在 C++ と Matlab で作業していますが、他の言語を考慮した一般的な意見にも非常に興味があります。