設計モードの概要

5362 ワード

1.設計モードの概念
       (Design )        、      、       、         。              、           、       。

2.設計モデルの六大原則
単一職責の原則
単一職責原則(Single Responsibility Principle,SRP):1つのクラスについて、その変化の原因は1つしかないはずです.つまり、1つのクラスは1つの機能分野の対応する職責のみを担当する必要があります.
単一職責原則は高集約、低結合を実現する指導方針であり、それは最も簡単であるが最も運用しにくい原則であり、設計者が類の異なる職責を発見し、それを分離する必要があるが、類の多重職責を発見するには設計者が強い分析設計能力と関連実践経験を持つ必要がある.
開閉の原則
開閉原則(Open-Closed Principle,OCP):ソフトウェアエンティティ(クラス、モジュール、関数など)は拡張可能であるべきであるが、修正不可である.すなわち、ソフトウェアエンティティはできるだけ既存のコードを修正せずに拡張すべきである.
開閉原則を満たすためには,システムを抽象化設計する必要があり,抽象化は開閉原則の鍵である.
リ氏置換の原則
Liskov Substitution Principle(Liskov Substitution Principle,LSP):親を参照するすべての場所で、子のオブジェクトを透過的に使用する必要があります.つまり、子のタイプは親のタイプを置き換えることができます.
リ氏置換の原則は,ソフトウェアで1つのベースクラスオブジェクトをそのサブクラスオブジェクトに置換すると,プログラムに誤りや異常は生じず,逆に成り立たないことを示しており,1つのソフトウェアエンティティがサブクラスオブジェクトを使用している場合,必ずしもベースクラスオブジェクトを使用できるとは限らない.したがって、プログラムではできるだけベースクラスタイプを使用してオブジェクトを定義し、実行時にサブクラスタイプを決定し、親オブジェクトをサブクラスオブジェクトに置き換えます.同時に、リ氏置換原則は開閉原則を実現する重要な方法の一つである.
依存逆転の原則
依存逆転原則(Dependency Inversion Principle,DIP):抽象は詳細に依存すべきではなく、詳細は抽象に依存すべきである.すなわち、実装プログラミングではなくインタフェースに対してプログラミングすべきである.
多くの場合、私たちは開閉原則、里氏置換原則と依存逆転原則を同時に使用し、開閉原則は目標であり、里氏置換原則は基礎であり、依存逆転原則は手段である.
インタフェース分離の原則
インタフェース分離の原則(Interface Segregation Principle,ISP):単一の総インタフェースを使用するのではなく、専用のインタフェースを使用します.つまり、クライアントは不要なインタフェースに依存するべきではありません.
インタフェース分離の原則に基づいて、インタフェースが大きすぎる場合、より細かいインタフェースに分割する必要があります.このインタフェースを使用するクライアントは、それに関連する方法を知るだけでいいです.各インタフェースは相対的に独立した役割を負わなければならない.やるべきでないことをしないで、やるべきことをしなければならない.
ディミットの法則
ディミット法則(Law of Demeter,LoD):1つのソフトウェアエンティティは、できるだけ他のエンティティと相互作用しないようにしなければならない.
ディミットの法則は最小知識の原則(LeastKnowledge Principle,LIP)とも呼ばれる.
システムがディミット法則に合致する場合、あるモジュールが変更されると、他のモジュールにできるだけ影響を及ぼさず、拡張が比較的容易になります.これはソフトウェアエンティティ間の通信の制限であり、ディミット法則はソフトウェアエンティティ間の通信の幅と深さを制限することを要求します.ディミット法則はシステムの結合度を低減し,クラスとクラスの間に緩やかな結合関係を維持することができる.
合成多重化の原則
合成多重化の原則(Composite Reuse Principle):継承ではなく、できるだけ合成/集約を使用することが原則です.
3.****23種類の古典的な設計モードは以下の表で一目瞭然である.
≪モードの作成|Create Mode|emdw≫:クラスのインスタンス化プロセスの抽象化.一部のシステムでは、オブジェクトを作成するときに、オブジェクトの作成方法、オブジェクトの作成方法、およびオブジェクトの組み合わせと表示方法を動的に決定する必要があります.作成モードは、これらの動的な決定をどのように構築し、カプセル化するかを記述します.クラスの作成モードとオブジェクトを含む作成モード.
≪構造モード|Structure Mode|emdw≫:クラスまたはオブジェクトを結合してより大きな構造を形成する方法を説明します.クラスの構造モードとオブジェクトの構造モードに分けられます.クラスの構造パターンは継承を用いてクラス,インタフェースなどを組み合わせてより大きな構造を形成する.クラスの構造モードは静的です.オブジェクトの構造モードは、新しい機能を実現するために、さまざまなタイプのオブジェクトをどのように組み合わせるかを記述します.オブジェクトの構造モードはダイナミックです.
動作モード:異なるオブジェクト間で責任とアルゴリズムを区別する抽象化.クラスとオブジェクトだけでなく、彼らの相互作用についてです.クラスの動作モードは、継承関係を使用していくつかのクラス間で動作を割り当てます.オブジェクトの動作モードでは、オブジェクトの集約を使用して動作を割り当てます.
ソース:https://blog.csdn.net/longronglin/article/details/1454315
[画像のアップロードに失敗しました...(image-26276 a-152238137909)]
  • 作成型モード(5種類):単例モード、ファクトリメソッドモード、抽象ファクトリモード、コンストラクタモード、プロトタイプモード.
  • 構造型モード(7種類):エージェントモード、アダプタモード、アクセサリーモード、ゲートモード、ブリッジモード、コンビネーションモード、メタモード.
  • 行動型モード(11種類):ポリシーモード、責任チェーンモード、テンプレートメソッドモード、オブザーバモード、反復サブモード、コマンドモード、メモモード、ステータスモード、訪問者モード、仲介者モード、解釈器モード.
  • [画像のアップロードに失敗しました...(image-5 f 7 c 01-1522381379907)]
  • 関係図:
  • [画像のアップロードに失敗しました...(image-36 ba 29-152238137909)]
    4.まとめ
    一、作成型モード
    1、Singleton(Singleton):1つのクラスに1つのインスタンスしかないことを確保し、グローバルアクセスポイントを提供する.2、ファクトリメソッドモード(factorymethod):オブジェクトを作成するインタフェースを定義するが、サブクラスによってインスタンス化するクラスがどれであるかを決定する.工場の方法はクラスに実例化をサブクラスに延期させた.
    3、抽象ファクトリモード(Abstract factory):特定のクラスを指定することなく、関連または依存するオブジェクトのファミリーを作成するためのインタフェースを提供する.
    4、ジェネレータモード(Builder):ジェネレータモードを使用して一つの製品の構造過程をカプセル化し、手順に従って構造を許可する.複雑なオブジェクトの構築とその表現を分離することで、同じ構築プロセスで異なる表現を作成することができる.5、プロトタイプモード(prototype):所与のクラスを作成するインスタンスプロセスが高価または複雑である場合、プロトタイプモードを使用する.6、マルチモード(Multiition):一つの解決方案の中で二つ以上のモードを結合して、普通或いは繰り返し発生する問題を解決する.
    二、構造型モード
    1、プロキシモード(Proxy):他のオブジェクトに対して、そのオブジェクトへのアクセスを制御するための代替またはプレースホルダを提供する.2、アダプターモード(Adapter):一つのクラスのインタフェースを、お客様が望むもう一つのインタフェースに変換する.アダプタは、元のインタフェースが互換性のないクラスを連携させることができる.オブジェクトアダプタは組合せを用いる、クラスアダプタは多重継承を用いる.
    3、装飾者モード(decorator):動的に責任を対象に付加し、機能を拡張するには、装飾者は継承よりも弾力性のある代替案を提供する.4、外観モード(facade):サブシステムの一群のインタフェースにアクセスするための統一的なインタフェースを提供する.外観は、サブシステムをより容易に使用できるように、高レベルのインタフェースを定義する.
    5、ブリッジモード(Bridge):ブリッジモードを使用することで、実装と抽象を2つの異なるクラス階層に配置することによって、それらを独立に変更することができる.
    6、コンビネーションモード(composite):オブジェクトをツリー構造に組み合わせて「全体/部分」階層を表現することができる.コンビネーションは、お客様が個別のオブジェクトおよびオブジェクトのコンビネーションを一貫した方法で処理することができる.7、Flyweight:あるクラスの1つのインスタンスが多くの「仮想インスタンス」を提供するために使用できるようにするには、ハエ量モードを使用する.
    三、行動型モード
    1、戦略モード(strategy):アルゴリズムファミリーを定義し、それらの間を互いに置き換えることができるようにそれぞれ閉鎖し、このモードはアルゴリズムの変化をアルゴリズムを使用する顧客とは独立させる.
    2、責任チェーンモード(Chain of responsibility):責任チェーンモードによって、ある要求に対してオブジェクトチェーンを作成することができる.各オブジェクトは、この要求を順番にチェックして処理するか、チェーン内の次のオブジェクトに渡す.3、テンプレート方法モード(Template):一つの方法でアルゴリズムの骨格を定義し、いくつかのステップをサブクラスに遅延する.テンプレート方法は、サブクラスがアルゴリズムの構造を変更することなく、アルゴリズムのいくつかのステップを再定義することができる.
    4、オブザーバーモード(observer):オブジェクト間で一対多の依存を定義することで、1つのオブジェクトが状態を変えると、依存するオブジェクトが通知を受け、自動的に更新される.
    5、反復器モード(iterator):集約オブジェクトの各要素に順次アクセスし、その内部の表現を露出する方法を提供する.6、コマンドモード(Command):「要求」をオブジェクトに閉じて、異なる要求、キューまたはログを使用して他のオブジェクトをパラメータ化する.コマンドモードは、取り消し可能な動作もサポートする.7.インタプリタモード(Interpreter):インタプリタモードを使用して言語にインタプリタを作成する.8、仲介者モード(Mediator):仲介者モードを使用して関連対象間の複雑なコミュニケーションと制御方式を集中する.9、メモモード(Memento):オブジェクトを前の状態に戻す必要がある場合(例えば、ユーザーが「取り消し」を要求する場合)、メモモードを使用します.10、状態モード(State):オブジェクトが内部状態が変化するときにその動作を変更することを許可し、オブジェクトがクラスを変更したように見える.11、ビジターモード(visitor):オブジェクトの組み合わせに新しい能力を追加し、パッケージが重要でない場合は、ビジターモードを使用します.