ブリッジモードの概要


橋梁モード定義:抽象と実現をデカップリングし、彼らが独立して変化することができる.ブリッジモードは、関係を継承する代替方法です.名詞の解釈:抽象と実現:これは設計モードの中で最も理解しにくいモードで、実はこれは中国語の翻訳の原因がもたらしたので、中国語の中で派生類を抽象類の実現と呼んで、橋梁モードの言う“実現”はちょうどこの意味ではありませんて、橋梁モードの中の“抽象”は抽象類と派生類を指して、「実装」とは、これらの抽象クラスおよび派生クラスが独自に実装される方法を指す.
デカップリング:結合とは、2つのエンティティの動作の何らかの強い関連である.それらの強い関連を取り除くことは、結合の解脱、または解結合と呼ばれる.ここで、デカップリングとは、抽象化と実装化との間の結合をデカップリングすること、またはそれらの間の強い関連を弱い関連に変更することを意味する.強い関連とは、コンパイル時期に確定され、実行時期に動的に変更できない関連である.弱い関連付けとは,動的に決定でき,実行時期に動的に変更できる関連付けである.Java言語では継承関係は強い関連であり,集約関係は弱い関連であることは明らかである.2つのキャラクタ間の継承関係を集約関係に変更することは、それらの間の強い関連を弱い関連に変更することです.従って、ブリッジモードにおけるいわゆるデカップリングとは、1つのソフトウェアシステムの抽象化と実装化の間で継承関係ではなく集約関係を使用し、両者を相対的に独立に変化させることを意味する.これが橋梁モデルの意図だ.私たちは具体的な例を持ってこの点を説明します:自動車管理のために1つの自動車管理の模型を創立して、各自動車メーカーが生産した各種の自動車に対して管理を行うことを要求します.私たちがこのように設計すると、まず抽象的な自動車類Carを設計します.JAvaは、トラックやバスのような異なる車がこの抽象的な自動車類を継承します.
Car.java:
public interface Car{
	void produce(){
	}
} 

Truck.java
public class Truck extends Car {
    public void produce() {
    }
}

Bus.java
public class Bus extends Car {
    public void produce() {
    }
}

自動車は多くの自動車メーカーに製造することができて、例えば一汽、二汽など、私達はこのように設計します:一汽生産のトラック類FawTruck.java
public class FawTruck extends Truck{
	 public void produce() {
    }
}

一汽生産のバス類FawBus.java
public class FawBus extends Truck{
	 public void produce() {
    }
}

二汽生産の貨車類DfmcTruck.java
public class DfmcTruck extends Truck{
	 public void produce() {
    }
}

二汽生産のバス類FawBus.java
public class DfmcBus extends Truck{
	 public void produce() {
    }
}

このような問題が発生しました.もし私たちが15車種、6社の自動車メーカーを持っているとしたら、私たちは15を実現しなければなりません.×6=90シードタイプの車種で、このような設計は必ずクラスの数の2倍の上昇をもたらし、仕事量が大きい.このような現象の原因は、自動車の抽象とその実現を結合し、車種とメーカーを分離できれば、問題は解決できるからだ.
橋梁モデルを利用して実現します.
Car.java
public abstract class Car {
    public Car(Manufacturer lnkManufacturer) {
        this.lnkManufacturer = lnkManufacturer;
    }

Car.java
public abstract class Car {
    public Car(Manufacturer lnkManufacturer) {
        this.lnkManufacturer = lnkManufacturer;
    }

   public void produce() {
		lnkManufacturer.produce();
   }

    /**
     * @directed 
     */
    Manufacturer lnkManufacturer;
}

製造者クラスManufacturer.java
public interface Manufacturer {
    void produce();
}

Truck.java
public class Truck extends Car {
    public Truck(Manufacturer lnkManufacturer) {
        super(lnkManufacturer);
    }


    public void produce() {
        lnkManufacturer.produce();
        System.out.println("   ");
    }
}

Bus.java
public class Bus extends Car {
     public Bus(Manufacturer lnkManufacturer) {
        super(lnkManufacturer);
    }
    public void produce() {
		lnkManufacturer.produce();
        System.out.println("     ");
    }
}

一汽Fawjava
public class Faw implements Manufacturer {
    public void produce() {
        System.out.println("    ");
    }
}

二汽Dfmc.java
public class Dfmc implements Manufacturer {
    public void produce() {
        System.out.println("    ");
    }
}

これで新しい車種が入ってきたら、Carを継承します.JAvaは、新しいメーカーが入ってきたらManufacturerを実現します.JAva、それ以外にコードを追加する必要はありません.お客様が一汽生産のトラックを採用するように要求した場合、クライアントで呼び出されたコードは以下の通りです.
public class Client {
    public static void main(String[] argv) {
        Car car = new Truck(new Faw());
        car.produce();
    }
}

同様に、車種やメーカーが変化した場合、クライアント対応のCarのサブクラスとManufacturerのサブクラスを変更するだけでよい.
ブリッジモードは,抽象クラス,抽象クラスの継承クラス,実装クラス,実装クラスの継承クラスの4つの部分から構成される.ブリッジモードの原理図は以下の通りです.コードは以下の通りです.
メソッドoperation()を宣言し、その実装を与えるロールクラスを抽象化します.この実装は実装化オブジェクトへの委任(operationImpl()メソッドの呼び出し)によって実現される.
public abstract class Abstraction {
    protected Implementor impl;
    public Abstraction(Implementor impl){
        this.impl = impl;
    }
    //    
    public void operation(){      
        impl.operationImpl();
    }
}

抽象クラスの実装クラス:
public class RefinedAbstraction extends Abstraction {
    public RefinedAbstraction(Implementor impl) {
        super(impl);
    }
    //       
    public void otherOperation(){
 
    }
}

実装クラス:
public abstract class Implementor {
    /**
     *     ,               
     */
    public abstract void operationImpl();
}


実装クラスの継承クラス:
public class ConcreteImplementorA extends Implementor {
    @Override
    public void operationImpl() {
        //    
    }
}
public class ConcreteImplementorB extends Implementor {
    @Override
    public void operationImpl() {
        //    
    }
} 

ブリッジモードの使用タイミング:システムが彼の抽象と実装の間でより柔軟性を高める必要がある場合、または1つのオブジェクトが1つ以上の抽象と実装である場合、ブリッジモードを使用する必要があります.