学ぶためにパターンを設計する(で)

2019年11月13日に書かれました

理解デザインパターンの前に堤防前に:
;一回のデモプログラムはどのように高いメンテナンス性を必要としないようにゴール1、パターンは、プログラムの保守性の非常に重要な指標である
指向のインターフェイスを認識し、認める2、プログラミングの利点、1にしてくださいルックバックを推奨するものではありません;
3、デザインパターンは、デカップリングの基本的な手段の性質を分離されて積層され、複数のサブ層は、より多くの関係が直感的ではありません。
4、完全にデザインパターンの実装には影響を与えません。需要、ちょうど書き込みコードは、はるかに再建、読んで、読んでも、「ステレオタイプ」デザインパターンに入りました。

行動パターン

Template Methodパターン
のテンプレートメソッドは、特にシステムの再構築に、モデルとして多く使用されています。あなたはより多くの同じクラスの2つ以上ある場合、コードはほぼ正確に少しだけ違い、同じである、我々は、テンプレートメソッドパターンを再構築するかどうかを検討しなければなりません。親は、良好なアルゴリズムのステップは、典型的には、抽象メソッド、サブクラスによって実装される抽象メソッドにパッケージの一部を変更するであろう。別の斜視テンプレートメソッドから、実際には、オブジェクト指向の補体多型であり、想像し、多型は、親クラス(インターフェイス)が良好な界面なりあり、サブカテゴリを実現し、現実は常に簡単にではないかもしれません一部は再利用可能な部品ですので、各サブクラスは、これらの再利用可能なコードを達成するために、各繰り返しは明らかに問題があること、それは、クラスを書くために親に再利用可能なコードプレフィックスのこの部分を再構築することですあなたは、その再建の後、まだテンプレート法を適用していないこと?欠点は、親クラスがサブクラスのメソッドは、デバッグの複雑さを増すだろう呼び出すです。

戦略モード
では、発信者がどのような戦略を知っている必要があることを呼び出し側にさらされているポリシーですので。それぞれが部分的なものは、他の戦略の使用との間の異なる方式を選択した場合...使用は下で考えることができると判定された場合に、複数の実装を有することを意味変化ストラテジタイプによってカプセル化された、置換されてもよいようにインターフェイスをプログラミング志向戦略パターンを交換します。使用戦略は、このようなLog4Jのクリーンアップ戦略を選択すると、非常に広範で、戦略の選択は、異なる戦略直列化プロトコルを選択し、初期設定では、内部ポリシーのさまざまなを選択するために、スレッドプール、およびさまざまなサードパーティのコンポーネントを拒否し、さらにいくつかの内部計算ロジック・アルゴリズムは、異なる戦略にパッケージ化することができます。戦略パターン嘘の本質は、修正のため閉鎖、拡張のために開放され、唯一の私の非常に安定し、状態は非常に固定する場合であればという方針の下数を使用する必要があるかどうか、クラスが使用できる新しい政策や戦略を追加する必要がありますここでの戦略パターン?例えば、私の戦略のベースとなって、これは性別に基づいて類似したシンプルなプラントソリューションを使用して、簡単な工場や月の工場モデル(12月-1月)との差を参照することができます(男性、女性、未知の3種類)、幅広いアプローチは、複雑さを軽減するために、ポリシークラスの数だけでなく、発信者の暴露戦略の必要性、呼び出し元に、より親しみやすい、第二を確立する必要がなく、性別または月に基づいて、適切な政策を取ら。また、モードモードを注文しないでください。

責任パターンのチェーン
Chain of Responsibilityパターンは、私たちに新しいものではない、ウェブプログラミングのフィルタは、網状のハンドラは、このモードで使用されていると思います。送信者と受信者、オブジェクトの複数の要求を処理する機会デカップル責任のパターンのチェーン。ここは、パターンどのような状況下での使用に適しているのですか?まず、組立ライン上のノードへの連鎖と同等のすべてのステップを処理し、パイプライン処理の場合があり、操作の一部が、他の場合は、「責任を転嫁」の存在である、完成された、と私は隣の家に対処するために、扱うことができませんでした、隣の家のかもしれません彼は彼の次の在宅治療を行いました。すべてのすべてでは責任パターンのアプリケーション処理チェーンチェーンの必要性の場合です。チェーン化した後、パフォーマンスの低下を持っているにバインドされている、特にときの長鎖:モデルには欠点があります。

オブザーバーパターン
すなわちオブジェクトは、それに依存するすべてのオブジェクトが自動的に通知され、更新されるたびに状態を変化させるように、被写体とは、オブザーバーパターンは、多くの依存関係を定義します。Observerパターンは、多くの場合、放出をもたらす、ユニバーサルアクセスとしてのRedis、ミドルウェアメッセージング、ちょうど分散方式ため、サブスクリプションモデルは、正式なデザインパターンではありません公開、まず、比較のためにモデルをパブリッシュおよびサブスクライブするために使用されますサブスクリプションモデルが広く使用されている。第二に、オブザーバーパターンであると考えることが最終的にパターンを公開、サブスクライブ?この問題は議論が、それは紛れもないですが、それはと同じオブザーバーパターン効果に達している:オブジェクトの状態が変化すると、それに依存するすべてのオブジェクトが通知され、自動的に更新されているのか、さらにそれが観察されたよりも、モードによって、より完全に出版社と両側が完全に互いの存在を知っている必要はありませんすることができますので、メッセージの受信者デカップル。なぜここObserverパターンを使うのか?例えば、シーンにボーナスを登録積分モードは、コードを記述するために、プロセス指向の方法を使用しない場合、全体のプロセスであるように第一、論理レジスタと論理的報酬を行う第2のステップと、ステップ統合を増加させました。ビューの場合にのみ、完全な需要点以上のアプローチ何の問題もなく。しかし、需要は常に変化している、スケーラブル(修正)のセックスは、私たちは、登録のための新たな運用要件の統合を向上させ、クーポンを送信するのであれば、我々は、直面しなければならない問題です。あなたが大規模な確率を扱うその方法は、開閉の原則に違反するギフトバウチャーロジックへのインセンティブロジックの第二段階の実装となります。オブザーバーモードは、あなただけのクーポンプレゼントのオブジェクトを追加し、この件名の登録ユーザーに加入する必要がある場合は、全体のプロセスは、このロジックにユーザ登録を変更しません。メッセージは、サブスクライブ・モデルを公開したキュー場合は、ユーザ登録が完了すると、それはメッセージだけでメッセージキューのパブに、よりシンプルで、ユーザオブジェクト上のイベントのフォーカスのための登録は、メッセージ・キューに登録し、自分自身を処理することができます。

状態モデル
のサブクラスとして実装操作に対応するオブジェクトの状態に状態モデル、例えば、3つの動作があり、登録されたクレジット、消費された状態に対応する3つの操作は、次のとおり未登録、登録、クレジットされています。もし...他の伝統的な判定コードの構造は、実質的にされています。クレジットは、ユーザーが登録しているかどうかを決定する、またはプロンプトに対応する際に、費やさに、ユーザが登録時に登録された、またはプロンプト対応していないかどうかを判断しますユーザーは、クレジット、そうでない場合は、対応するプロンプトを持っているかどうかを決定する場合。もし新しく追加された一つの状態、適切な変更を行うためのロジックの登録、クレジット、支出を想像してみてください。未登録、登録、クレジットがスリーステート・クラス、各クラスの実装状態レジスタ、クレジットは、状態は、発呼者によって指定されたユーザに対応し、これら3つのメソッドを消費した後の状態パターンの再構成が生成され、そして新しい状態が状態に対応するときだけで、既存のコードのロジックを変更せずに、サブクラスを追加します。状態パターンモデルは非常に類似した構造およびポリシー、ポリシーモデルに対応するポリシーは、呼び出し元によって指定され、状態モデルは、発信者に対応する状態であり、より一般的な戦略パターンプロパティで、状態切り替えによって指定することができます。三つ以上の層の存在は、他のコードスイッチ又は分岐条件のフィールドが決定された状態値である場合...あれば、状態決意の複数の存在下で適用可能な状態モードは、状態モードを再構成すると考えることができます。

イテレータパターンは、
オブジェクトの内部表現を暴露していない、責任があるとオブジェクトのトラバーサル行動コレクション、抽象イテレータクラスを単離しました。Javaでコレクション自己エンコーディングローカルカスタム・コレクション・クラスを達成するために、日々のビジネスニーズをIteratorを達成している多くを行う、もしあれば、Javaのコレクションの組み合わせは、より提供するために、Javaのコレクションクラスから少し内部被ばくによって定義することができていますこのような構文のサポートなどの簡単なアクセス、ので、このモデルの適用の毎日プログラミングはあまりないです。しかし、JDKのクラスライブラリのサポートのために、私たちはほとんど、これはデザインパターンで忘れていることを、この使用のためにあまりにもありふれたものです。利点は、オブジェクトの内部表現を公開する必要はありません、だけでも、一貫性のあるアクセス・インタフェースを提供しながら、時に新しいコレクションイテレーションクラスの新しいセットを追加する必要があります。欠点はペアのクラスとクラスの反復増加のコレクションです。

仲介モデル
機関の人生はどこにでもある、古い文字です。機関の現実と同様Mediatorパターンは、そのコアは、このようにオブジェクトとオブジェクトとの間の直接結合を低減、メッシュ結合関係スターカップルの関係を変更することです。私たちの最も一般的なMVCモードCは、利点は、彼らが独立して変更することができるように、MとVのデカップリングで、仲介クラスです。(チャットルームとしてモデル化)のメディエーターではない場合には、各ユーザが他のチャットルームのユーザーの参照を保持するためにそのようなチャットルームのように、ユーザがコードに反映され、典型的な関係であるとネットワークとの間の関係は同じです、ユーザとユーザの間に非常に緊密密結合のデカップリングすることを、関係、およびメディエーターの導入に結合されます。ユーザーは、(チャットルーム)仲介者にターゲットユーザーへのメッセージを、それをメッセージのみを必要としています。メッシュのプロセスに2つの可能性のある問題は、最初の質問が小さすぎる選択メディエーターであり、スターにあり、彼らが作り出すことが異なる仲介の間に極端な場合には、すべての2つのオブジェクト間の仲介者は、そこにありますネットワーク協会が、関係はより複雑になってきています。別の問題は、メディエーターがインターフェイスの数の大幅な増加をもたらす、多すぎる、この場合、あまりにも多くの責任仲介を選択することです。だから、仲介モデルは、通常モデルの他のデザインパターンと弁証法と注意して使用されています。

パターンインタプリタ
インタプリタモードは、独自の式評価は、インタプリタモードで達成することができる達成するなど、テキストの文字列を解決するために使用されていることを人気のポイント。動的SQLスクリプトやアプリケーション、コーディング、および日常の業務用以下の場所の「文法」をカスタマイズする必要の様々なため、そのパターンは少し実用化しました。新しいクラスを高め、高拡張性の利点は、古い分析解析コードを変更する必要はありません。核となるアイデアは、構文木、再帰呼び出しを計算するための時間を構築することです。

メモモードは、
オブジェクトが将来的には以前に保存した状態に復元できるように、オブジェクトの内部状態をキャプチャし、オブジェクトの状態の外を保存するために、メモモードがパッケージに損傷を与えることなく、あると呼ばれます。我々は、デザインパターンメモやアーカイブの回復を達成するために使用され、メモモードと非常によく似ている現実には注意してください。シナリオを想像して:あなたは、オブジェクトを持って発信、オブジェクトの特定のフィールドをサポートする必要性は(すべてではない)、ある時点での状態に戻りました。すべてのフィールドを単一の責任に基づいて、保存する必要があるオブジェクトので発信部分的にしかフィールドは、支持回復に必要とされるが、そのパッケージを破壊しないようにするために、メモメメントクラスを導入する必要性は、オブジェクトが格納するための責任があるオリジネータクラス:次のようにメモモードが実装されています原則、そして最終的に導入された世話人(管理職)労働者階級は、メモを保存する責任があります。

コマンドモード
コマンドモード、彼らは唯一の実装も元に戻すとやり直しを容易に、新しいコマンドを簡単にシステムに追加することができ、独立して変更することができます達成コマンドキューイングを容易にするために、どのコマンドコマンドに依存しているように、発信者と受信者のデカップリング操作。コマンドモードは、コマンドに抽象化、デカップリングするコマンド観光名所の受け手です。特定のコマンドで、受信者の例と対応する操作コマンドが引用されました。このコマンドの送信者は、さまざまなコマンドを送信する責任があります。送信者は、受信者が、異なる送信者の異なる複数に対応することができ、異なる受信者の同一の複数に対応することができます。私たちの一般的なアクションのStrutsはコマンドモードで使用されている、ワークフローエンジンActivitiが承認、回覧の全体のプロセスを開始し、変数の設定は、コマンドモードを完了するために使用されています。次に、どのように我々は日常のプログラミングでは、このモデルを適用していますか?発信者が特定の受信者に対応していないか、さらに、保留中のいずれかが存在する場合に、従来の方法を使用し、他の参照方法のいずれかを呼び出し、このとき、デカップリングに意図コマンドモードを使用することができません。アンドゥおよびリドゥを提供するために、コマンドキューを達成することが所望される場合、さらに、このモードを使用することも考えられます。

Visitorパターンの
訪問者、名前が示すように、アクセスを行うためのオブジェクトを与えることです。これは非常に奇妙です:このオブジェクトでの訪問はそうではありませんか?内部アクセスオブジェクトは、これを行う方法はないでしょうか?
this.methodXと()それはあなたが行うことはできませんか?なぜ、単一のビジタークラスを追加しますか?構造(基本的なプロパティとメソッド)のクラスは安定しているが、アクセス方法が簡単に変更する場合は、想像し、ビジネスの変化だけ訪問者を変更する必要がされていないときに、クラスに描かれた訪問者の一部を、変更するのは簡単ですラインその上にクラス?それの「静的および動的分離」効果に達していませんか?デメテルは、あまりにも多くを知っているオブジェクトは、訪問者のタイプ(ビジター)は、訪問者クラス(要素)ではないことがあることを他のオブジェクトの少しの知識としてでなければならないことを言いましたか。バックルディテール場合は、そのように確かにデメテルの法則に違反しているけど、エレメントおよびビジターは、全体として考えた場合?固定式要素、リロードビジター訪問アクセス方法の数は、一般的に要素、要素の種類の数と同じであるとき(インタビュー)メソッド受け入れる所定の式を有します。訪問者のシーンモードでは、より厳しいに適応する:要素数と構造がより安定し、アクセス方法/アルゴリズムとボラティリティが来場者の利用を検討するかもしれません。

おすすめ

転載: www.cnblogs.com/mzsg/p/11978035.html