デザインパターン - 7つの設計原理(A)

デザインパターン - 7つの設計原理(A)

アウトライン

簡単な7つの設計原理:
開閉原則:すべてのコアオブジェクト指向設計、拡張のためのオープンが、修正のため閉鎖その
プログラミング・インタフェースについては、抽象的に依存するのではなく、特定に頼る:依存関係逆転の原則
単一責任の原則:唯一のインターフェース一つのことに責任を、一つだけのクラスは変動原因となる
インターフェイス分離の原則を:というと、一般的なインタフェースを使用するよりも、複数の専門的なインターフェースの使用、
デメテル(少なくとも知られている原則を):のみ(メンバ変数、入力方法の友達と通信します出力パラメータ)は、見知らぬ人に話をアクセス修飾子コントロールしていない
リヒター置換原則:サブクラスは親クラスの機能を拡張することができますが、親クラスの本来の機能に変更することはできません
(HAS-対象組成物の使用を作るために:合成多重化の原則をA)/重合(contanis-A)の代わりに、ソフトウェア再利用するオブジェクトの関係を継承


オープンクローズ原理

定義

これは、修正のために拡張するためのオープンが、閉じなければならないようなクラス、モジュール及び機能のようなソフトウェアエンティティを指します。
開閉いわゆる、また、2の動作を拡張し、変更するための原則です。重点は拡大を達成するための詳細を、抽象フレームを構築することです。システムは、ソフトウェアの再利用性と保守性を向上させることができます。オープニングとオブジェクト指向設計の原則を閉じるには、最も基本的な設計原理です。それは我々が安定しており、柔軟なシステムを構築する方法を案内し、例えば:私たちは、バージョンを更新し、私はソースコードを変更しないようにしよう、しかし、あなたが新しい機能を追加することができます。

実生活では、開閉の原則にも反映されています。例えば、多くのインターネット企業は、柔軟な生産時間情報の実装、1日8時間の規定されています。彼のポイントは、1日8時間の作業のため、この規定が近いということですが、あなたが来たときに、開いたときに行くことです。初期の後半と後期残し、早退します。

開口部の原理を実装し、コアアイデアを閉じると抽象指向プログラミングにあり、我々はコードの一部を見てみましょう。

ブック・インターフェースを作成するには、例えば、書籍を販売する書店:

/**
 * @author eamon.zhang
 * @date 2019-09-25 上午10:26
 */
public interface IBook {
    // 书籍名称
    public String getName();
    // 价格
    public int getPrice();
    // 作者
    public String getAuthor();
}

フィクションの本を作成するなど、小説、など多くのカテゴリに分かれブック、、:

/**
 * @author eamon.zhang
 * @date 2019-09-25 上午10:30
 */
public class NovelBook implements IBook {
    // 书名
    private String name;
    // 售价
    private int price;
    // 作者
    private String author;
    // 通过构造函数传递数据数据
    public NovelBook(String name, int price, String author) {
        this.name = name;
        this.price = price;
        this.author = author;
    }
    // 获取书名
    public String getName() {
        return this.name;
    }
    // 获取价格
    public int getPrice() {
        return this.price;
    }
    // 获取作者
    public String getAuthor() {
        return this.author;
    }
}

私たちは、フィクションの本は今の活動を行う価格の譲歩を与えます。あなたは()メソッドでgetPrice NovelBookを変更した場合、一定のリスクは、それが他の場所で呼び出しの結果に影響を与える可能性が存在することになります。どのように我々は価格に、この機能を実現するために、元のコードを変更せずに前に進んでいますか?今、私たちは(DiscountBookを呼び出すのではなく、私はNovelDiscountBookと呼ばれる理由を考える)NovelDiscountBookクラス、優先ロジッククラス処理を記述します。

/**
 * @author eamon.zhang
 * @date 2019-09-25 上午10:36
 */
public class NovelDiscountBook extends NovelBook {
    public NovelDiscountBook(String name, int price, String author) {
        super(name, price, author);
    }

    public double getOriginPrice(){
        return super.getPrice();
    }

    public double getPrice(){
        return super.getPrice() * 0.85;
    }
}

図のクラス構造。

image.png


依存関係逆転の原則

定義

依存性逆転原理(DependenceInversionPrinciple、DIP)が設計コード構造を指す場合、層モジュールは、抽象化に依存する必要がありどちらの基本モジュール、に依存してはなりません。要旨は細部に頼るべきではありません。詳細は抽象的に依存しなければなりません。クラスとクラスの間の結合を低減し、システムの安定性を向上させることができる反転依存することにより、コードの可読性と保守性を向上させ、プログラムが引き起こされるリスクを減少させるために修飾することができます。

私たちは、例えば、本を読んだり、イーモンカテゴリを作成します。

/**
 * @author eamon.zhang
 * @date 2019-09-25 上午11:09
 */
public class Eamon {
    public void readNotreDame(){
        System.out.println("Eamon 在阅读 《巴黎圣母院》");
    }

    public void readTheOldManAndTheSea(){
        System.out.println("Eamon 在阅读 《老人与海》");
    }
}

テストクラスは、それを呼び出す書きます:

public static void main(String[] args) {
    Eamon eamon = new Eamon();
    eamon.readNotreDame();
    eamon.readTheOldManAndTheSea();
}

イーモンは現在、読者の2冊です。しかし、学習は無限大です、私はイーモンはこれらの本を読んだ後、「ドラゴン」を読んでもらいたいです。今回、事業拡大、トップ(コール・レベル)に下から我々のコードは、一度コードを変更します。クラス()にreadTianLongBaBuイーモンメソッドを追加し、先頭に追加のコールを持っています。このように、システムのリリース後、実際には、それはコードを変更することも予想外のリスクをもたらすでしょう、非常に不安定です。次に、我々は、カリキュラム抽象iBookのインターフェイスを作成、コードの最適化:

/**
 * @author eamon.zhang
 * @date 2019-09-25 上午11:20
 */
public interface IBook {
    void read();
}

そして、書き込みNotreDameBookカテゴリを:

/**
 * @author eamon.zhang
 * @date 2019-09-25 上午11:22
 */
public class NotreDameBook implements IBook {
    public void read() {
        System.out.println("Eamon 在阅读 《巴黎圣母院》");
    }
}

書く   TheOldManAndTheSeaBook  のカテゴリ:

/**
 * @author eamon.zhang
 * @date 2019-09-25 上午11:23
 */
public class TheOldManAndTheSeaBook implements IBook{
    public void read() {
        System.out.println("Eamon 在阅读 《老人与海》");
    }
}

変更しEamonたクラスを

/**
 * @author eamon.zhang
 * @date 2019-09-25 上午11:09
 */
public class Eamon {
    public void read(IBook iBook){
        iBook.read();
    }
}

ビューの呼び出し:

public static void main(String[] args) {
    Eamon eamon = new Eamon();
    eamon.read(new NotreDameBook());
    eamon.read(new TheOldManAndTheSeaBook());
}

私たちはコードを表示します。この時間は、イーモンが本のために、私はちょうど新しいクラスを作成する必要があり、どんな本を読んで考えて、基礎となるコードを変更することなく、パラメータ渡しモードを通じてイーモンに語りました。実際には、これは、依存性注入と呼ばれる非常に身近な方法、です。そこコンストラクタ・インジェクションウェイウェイ・ウェイとセッター。我々はコンストラクタ・インジェクション方法を見て:

/**
 * @author eamon.zhang
 * @date 2019-09-25 上午11:09
 */
public class Eamon {

    public Eamon(IBook iBook) {
        this.iBook = iBook;
    }

    private IBook iBook;

     public void read(){
        iBook.read();
    }
}

呼び出し元のコードを見て:

public static void main(String[] args) {
    Eamon eamon = new Eamon(new NotreDameBook());
    eamon.read();
}

コンストラクタ・インジェクションモードによると、あなたが呼び出すときに、毎回インスタンスを作成します。イーモンがグローバルシングルトンであれば、我々は唯一のコードイーモンクラスを変更し続けることセッター道を注入するために選択することができます。

/**
 * @author eamon.zhang
 * @date 2019-09-25 上午11:09
 */
public class Eamon {
    private IBook iBook;
    public void setBook(IBook iBook) {
        this.iBook = iBook;
    }
    public void read(){
        iBook.read();
    }
}

呼び出し元のコードを見て:

public static void main(String[] args) {
    Eamon eamon = new Eamon();
    eamon.setBook(new NotreDameBook());
    eamon.read();

    eamon.setBook(new TheOldManAndTheSeaBook());
    eamon.read();
}

最後のクラス図

image.png

覚えておいてください:抽象的にははるかに安定したインフラストラクチャを構築するための基礎の詳細と比べて、私たちはニーズがプログラミング・インタフェースを配向させるの後、最初のトップレベルの詳細は、コードの構造を再設計してもらいます。

声明

テキスト基準ネットワークの一部!

削除されたマップソースのネットワーク侵入を網羅!

オリジナルコンテンツは、転送元を明記してください!

おすすめ

転載: www.cnblogs.com/eamonzzz/p/11584138.html