問題タブ [strategy-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.
c# - インターフェイスで異なるパラメーターを使用した戦略パターン (C#)
私は基本的に戦略パターンを実装しようとしていますが、「インターフェイス」実装 (同じオブジェクトから継承する) に異なるパラメーターを渡したいのですが、これが可能かどうかはわかりません。間違ったパターンを選択している可能性があります。次のようなエラーが表示されます
「StrategyA」は、継承された抽象メンバー「void DoSomething(BaseObject)」を実装していません
以下のコードで:
c# - 異なるリターンクラスを使用した戦略パターンの実装
さまざまなタイプのxmlメッセージを処理するMessageProcessorクラスがあります。メッセージタイプに基づくswitchステートメント(C#)は、適切なメソッドを呼び出してxmlを解析し、メッセージのタイプに必要なデータを抽出します。
むしろ、いくつかのパーサークラスが必要です。そのうちの1つは、メッセージタイプに基づいて作成されたときにMessageProcessorに挿入されます。スイッチはポリモーフィズムに置き換えられました-これまでのところ良好です。
ただし、私が抱えている問題は、現在のパーサーメソッドがそれぞれ異なる結果を返すことです。たとえば、ParseExecute(xml、out Session)、ParseCallback(xml、out id、out name、...)
このシナリオでやりたいことをすることは可能ですか?
design-patterns - テンプレートメソッド(分離)と戦略パターンの違いは?
私の先生は本当に良い人で、彼のポイントを理解する傾向がありますが、これは私の頭を悩ませています. 彼は Template Method を 2 つのバリエーションで説明しています。
- 統一: 標準のバリアント。それ以外の場合は修正されたアルゴリズムのバリアント部分を定義するいくつかの抽象メソッドを持つ抽象クラスで構成されます。
- 分離: クラスに templateMethod() が含まれ、インターフェイスへの委譲を使用してアルゴリズムの部分を変更する彼自身のバリアント (と思いますか?) は、Strategy パターンとまったく同じように見えます。
彼のポイントが何であるか、そして「分離」バリアントが戦略パターンとどのように異なるかを誰でも見ることができますか?
彼の本 (まだ出版されていません) から 2 つのパターンを含む画像を添付しました。
c# - C#: Strategy オブジェクトの抽象ファクトリとして機能する抽象戦略基本クラス
私は、本質的に地理的な入力を使用して表形式の結果を生成する、会社用の Web ベースのツールを作成しようとしています。現在、3 つの異なるビジネス分野が私のツールを使用しており、3 種類のアウトプットを受け取ります。幸いなことに、すべての出力はマスター テーブル - 子テーブルという同じ考え方に基づいており、共通のマスター テーブルを共有しています。
残念ながら、いずれの場合も、子テーブルの関連する行には大きく異なるデータが含まれています。これが唯一の争点であるため、FetchChildData
メソッドを という別のクラスに抽出しましたDetailFinder
。その結果、私のコードは次のようになります。
PlanningFinder、OperationsFinder、および MaintenanceFinder はすべて DetailFinder のサブクラスです。
if
別のビジネス分野のサポートを追加するように依頼されたばかりで、このブロックの傾向が続くのは嫌です。私が好むのは、次のような解析メソッドを持つことです。
DetailFinder
ただし、 ifブロックをメソッドにシフトするだけでなく、各文字列を処理するサブクラス、または存在するサブクラスを知る方法について途方に暮れていParse
ます。サブクラスが自分自身を抽象に登録する方法はありDetailFinder
ますか?
java - この Java 戦略パターンには冗長な Context クラスがありますか?
次のコード サンプルは、Wikipedia からコピーした Strategy パターンの実装です。私の完全な質問はそれに続きます...
ウィキのmain
方法:
パターンピース:
上記の例を具体的に考えると、Context
クラスは冗長ですか?
main
たとえば、 Context を除く既存のクラスとインターフェイスを使用して、次の代替実装を考え出すことができます。これはまったく同じように機能します。まだ疎結合です。
((編集:この単純なシナリオで、Context クラスを省略した場合、将来間違いを犯すことになりますか? ))
まとめの更新
回答とコメントを通じて発見されたものをポイント形式でリストします。
- Context は、合成された Strategy の使用方法 (呼び出しのタイミングなど) のバリエーションを可能にします。異なるコンテキストは、特定の戦略を呼び出す前と後に異なる内部作業を行う場合があります。
- コンテキストは高レベルの「ブラック ボックス」です。クライアントはコンテキストの呼び出し方法しか理解できないため、クライアントを壊すことなく、コンテキスト ロジックを変更したり、合成された戦略を変更したり (または別のものを使用したり) することができます。
- Context を省略してウィキペディアのサンプル コードの別の実装を作成しましたが、元のコードと同じように機能しましたが、状況全体が単純化され (どちらの場合も)、私の変更は実際には次のことを意味していました: 1. 戦略ではない2.ここで言及されている戦略パターンの精神の利点が恋しいです。
- 私の別の実装では、Context のようなメイン メソッドを使用していたので、効果的にシミュレートする場合は、Context を保持した方がよいでしょう。不純な戦略パターンを作成することで、混乱が生じました。一からやり直す必要も、より賢くしようとする必要もありませんでした (この場合)。
他のポイントが役立つ場合、またはこれを修正する必要がある場合は、コメントを残してください。それに応じてリストを変更します.
design-patterns - 戦略パターンでは、戦略は Context をパラメーターとして受け取ることができます
フィードバックの概要
では、この広告を閉じて (これ以上のフィードバックはないと思います)、私が理解したことを要約してみます。
- 戦略のパラメーターとして「コンテキスト」を使用すると、回避する必要がある密結合が発生し、おそらくクラスに隠されているはずのプロパティを公開することを余儀なくされる可能性があります。
- カップリングを最小限に抑えるには、必要な値を提供するか、少なくとも戦略への具象型の代わりにインターフェイスを使用することをお勧めします。
私は戦略パターンの明確な概要を把握しようとしており、コンテキストに依存する戦略を持つことが良い設計か悪い設計かを自問しています。
次の古典的な実装を見てみましょう
私が見たすべての例には、基本的な引数 (整数など) を取る非常に単純な戦略があります。私が知りたいのは、戦略がコンテキストを使用して作業を行う場合に何か問題があるかどうかです。
それは次のようなものを与えるでしょう
そして呼び出しは
この「結合」は避けるべきですか?大丈夫ですか?
c# - new Func を使用してウィキペディアの戦略パターンの例を理解しようとする
http://en.wikipedia.org/wiki/Strategy_patternを見ていて、戦略パターンの概念を理解しましたが、誰かが C# の例を少し説明してくれませんか。
Context クラスの 'Strategy' の定義の方法と理由が本当にわかりません。なぜFunc<T, T, T>
ですか?
objective-c - Objective-C で戦略パターンを作成するには?
メインクラスオブジェクトを使用して他の3つのクラスのオブジェクトを参照する必要がある他の3つのクラスを持つメインクラスがある戦略パターンを開発する必要があります.これを解決するには、戦略パターンが役立ちますか? もしそうなら、Objective-C の構文を教えてください。
c# - 匿名メソッドでデリゲートをキャプチャする
検討
printActionが_captureActionによって呼び出される理由は、その行が
実際に変換します
したがって、CaptureActionFromParam()の_captureActionによってキャプチャされたアクションは変更されません。つまり、TestSimpleCapturedAction()のローカルの「action」変数のみが影響を受けます。
このようなシナリオでの私の望ましい動作は、printActionが呼び出されないことです。私が考えることができる唯一の解決策は、新しい「デリゲートコンテナ」クラスをそのように定義することです。
これは機能しますが、この新しい抽象化レイヤーを導入しなくても、希望する動作を実現できるのではないかと思います。戦略パターンを実装すると、そのような状況に簡単につながる可能性があるため、言語を考慮したり、BCLが何らかの形でネイティブにサポートしたりします。
ありがとう !
c# - IOC コンテナーを使用した戦略設計パターン - 特に Ninject
戦略設計パターンを使用する必要があるクラスがあります。実行時に、さまざまなアルゴリズムを切り替えて、アプリケーションのパフォーマンスへの影響を確認する必要があります。
問題のクラスは現在、コンストラクターで 4 つのパラメーターを取り、それぞれがアルゴリズムを表しています。
Ninject (または一般化されたアプローチ) を使用して IOC を使用しながら戦略パターンを使用するにはどうすればよいですか?
現在の制限は、カーネル (コンテナー) が各アルゴリズム インターフェイスを認識していることですが、それは 1 つの具体的なクラスにしかバインドできないということです。現時点でこれを回避する唯一の方法は、構築時に 8 つのアルゴリズムすべてを渡すことですが、異なるインターフェイスを使用しますが、これはまったく必要ないようです。IOC コンテナーを使用していなければ、これを行うことはないので、何らかの方法でこれを回避する必要があります。
コード例:
実行時に切り替えることができるように、人は両方のアルゴリズムを利用する必要があります。ただし、TestAlgorithm はコンテナー内の最初のものであるため、バインドされているのは TestAlgorithm だけです。