横たわるデザインパターンのノート(XIX)のブリッジモード

例えば

MとNの携帯電話の両ブランドで連絡先を作成すると、各ゲームの2つのソフトウェア。前提条件:MとNは、携帯電話の間で一般的ではありません。

反例アイデア1

メインの携帯電話のブランドとして、そのソフトウェアを実現しています。

反例アイデア2

本体、各アダプタブランドとして携帯電話ソフトウェア。

説明医療過誤

  • オブジェクトの継承がわかりましコンパイル時に定義されているので、私は、実行時に、親クラスが実装から継承され変更することはできません。
  • 実装のサブクラスとその親クラスは親クラスの実装に変更が必然的にサブクラスの変化につながるように、非常に近い依存関係を持っています。
  • あなたは継承された実装が新たな問題を解決するために適合しない場合、サブクラスを再利用する必要がある場合、親クラスが書き換えられたり、他のより適切なクラスに置き換えられなければなりません。
  • この依存性は、柔軟性を制限し、最終的に再利用性を制限します。

拡張:合成/ポリマー多重原則(CARP)

定義

すなわち:使用していないクラスの継承しようとすると、合成/高分子を利用すること。

  1. 手段重合弱い自身 '関係は、オブジェクトAがBを含むことができるオブジェクトを反映するが、オブジェクトは、オブジェクトの一部B Aではありません。
  2. これは、部品と同一の全体、部分及び全ライフサイクルの間に厳密な関係を反映し、「関係を持っている」強い合成です。

ベネフィット

優先/重合を使用して、オブジェクトの合成は、各クラスがカプセル化され、単一のタスクに集中して保つのを助けます。このようなクラスとクラス階層は小さいままとなり、少ない手に負えない怪物に成長します。

上記の原則の適用の例は、変換します

話は安いです、私のコードを表示します

(くそ以下、アップグレーディング)

/**
 * 手机软件
 * Created by callmeDevil on 2019/12/14.
 */
public abstract class HandsetSoft {
    public abstract void run();
}
/**
 * 手机游戏
 * Created by callmeDevil on 2019/12/14.
 */
public class HandsetGame extends HandsetSoft{
    @Override
    public void run() {
        System.out.println("运行手机游戏");
    }
}
/**
 * 手机通讯录
 * Created by callmeDevil on 2019/12/14.
 */
public class HandsetAddressList extends HandsetSoft{
    @Override
    public void run() {
        System.out.println("运行手机通讯录");
    }
}
/**
 * 手机品牌
 * Created by callmeDevil on 2019/12/14.
 */
public abstract class HandsetBrand {

    protected HandsetSoft soft;

    // 设置手机软件
    public void setHandsetSort(HandsetSoft sort){ // 品牌需要关注软件,所以可在机器中安装软件,以备运行
        this.soft = sort;
    }

    public abstract void run();

}
/**
 * 手机品牌M
 * Created by callmeDevil on 2019/12/14.
 */
public class HandsetBrandM extends HandsetBrand{
    @Override
    public void run() {
        soft.run();
    }
}
/**
 * 手机品牌N
 * Created by callmeDevil on 2019/12/14.
 */
public class HandsetBrandN extends HandsetBrand{
    @Override
    public void run() {
        soft.run();
    }
}
public class Test {
    public static void main(String[] args) {
        HandsetBrand ab;
        System.out.println("---手机品牌N:");
        ab = new HandsetBrandN();
        ab.setHandsetSort(new HandsetGame());
        ab.run();
        ab.setHandsetSort(new HandsetAddressList());
        ab.run();
        System.out.println("---手机品牌M:");
        ab = new HandsetBrandM();
        ab.setHandsetSort(new HandsetGame());
        ab.run();
        ab.setHandsetSort(new HandsetAddressList());
        ab.run();
    }
}

業績

---手机品牌N:
运行手机游戏
运行手机通讯录
---手机品牌M:
运行手机游戏
运行手机通讯录

変更の需要

他には何の変更を伴わない、ちょうどクラスを追加し、MP3音楽プレーヤーを追加

/**
 * 手机MP3
 * Created by callmeDevil on 2019/12/14.
 */
public class HandsetMP3 extends HandsetSoft{
    @Override
    public void run() {
        System.out.println("运行手机MP3");
    }
}

あなたがブランドを追加する場合は、唯一のクラスを追加する必要があります

/**
 * 手机品牌S
 * Created by callmeDevil on 2019/12/14.
 */
public class HandsetBrandS extends HandsetBrand{
    @Override
    public void run() {
        soft.run();
    }
}

ブリッジモード

定義

その実装から抽象化は、彼らが独立して変化できるようにします。

それはどんな意味がないので、抽象クラスとその派生クラスの平均分離はしないように、分離を達成するために、以下のことを注意してください。実現には、自分の目標を達成するための抽象クラスとその派生クラスを指します。

UMLダイアグラム

概要

  • 複数の角度を有することができる分類システムを実現し、それぞれの分類が変更される可能性があり、その後、彼らは彼らが角度の間の結合を減らすために、これだけで孤立休暇を置きます
  • 長い設計原理の本当の深い理解と同様に、実際には、デザインパターンの多くは、おそらく無意識のデザインパターンを使用することで、それの原則の適用です

おすすめ

転載: www.cnblogs.com/call-me-devil/p/12039921.html