橋接模式的用意是「將抽象化和實現化解耦,使兩者能夠獨立變化」。ide
存在於多個實體中的共同的概念性聯繫就是抽象化。抽象化把不一樣的實體當作一樣的實體對待。spa
抽象化給出的具體實現就是實現化。類的實例是類的實現化,子類是抽象超類的實現化。code
耦合就是兩個實體的行爲存在強關聯。去掉強關聯就是解耦,或者說將強關聯改成弱關聯。繼承是強關聯,聚合是弱關聯。對象
l 強關聯:blog
編譯時期已經肯定的,沒法再運行時動態改變的關聯。繼承
l 弱關聯:接口
能夠在運行時動態改變的關聯。get
橋接模式又叫橋樑模式,柄體模式,接口模式。橋接模式由抽象化角色、修正抽象化角色、實現化角色、修正是實現化角色組成。io
l 抽象化角色(Abstraction):編譯
抽象化給出的定義,保存一個對實現化對象的引用。因此這個角色必須是抽象類。
l 修正抽象化角色(Refined Abstraction):
擴展抽象化角色,改變和修正父類的抽象化定義。
l 實現化角色(Implementor):
給出實現化的接口,不給出具體實現。能夠和抽象化角色的接口定義不一樣。
l 具體實現化角色(Concrete Implementor):
給出實現化角色接口的具體實現。
抽象化角色:
/** * 抽象化角色 */ @Data public abstract class Abstraction { private Implementor implementor; /** * 委派給實現化角色 */ public void operate(){ implementor.doSomething(); } }
修正抽象化角色:
/** * 修正抽象化角色 */ public class RefinedAbstraction extends Abstraction{ @Override public void operate() { System.out.println("refined operate ..."); getImplementor().doSomething(); } }
實現化角色:
/** * 實現化角色 */ public interface Implementor { void doSomething(); }
具體實現化角色:
/** * 修正實現化角色 */ public class ConcreteImplementorA implements Implementor{ @Override public void doSomething() { System.out.println("concreteImplementorA doSomething ..."); } }
具體實現化角色:
/** * 修正實現化角色 */ public class ConcreteImplementorB implements Implementor{ @Override public void doSomething() { System.out.println("concreteImplementorB doSomething ..."); } }
客戶端:
/** * 客戶端 */ public class Client { public static void main(String[] args) { Abstraction abstraction = new RefinedAbstraction(); Implementor implementor1 = new ConcreteImplementorA(); System.out.println("setter ConcreteImplementorA"); abstraction.setImplementor(implementor1); abstraction.operate(); Implementor implementor2 = new ConcreteImplementorB(); System.out.println("setter ConcreteImplementorB"); abstraction.setImplementor(implementor2); abstraction.operate(); } }
示例:
如今有飛機制造商:空中巴士(Airbus)、波音(Boeing)、麥道(McDonnell-Douglas)。能夠生產載客飛機(Passenger Plane)、載貨飛機(Cargo Plane)。
這裏抽象化角色就是飛機種類、實現化角色就是飛機制造商。
抽象化角色:
@Data public abstract class AirPlane { abstract public void operate(); private AirPlaneMaker airPlaneMaker; }
實現化角色:
@Getter public abstract class AirPlaneMaker { protected String name; }
修正抽象化角色:
public class Airbus extends AirPlaneMaker{ public Airbus() { name = "空中巴士"; } }
修正抽象化角色:
public class Boeing extends AirPlaneMaker { public Boeing() { name = "波音"; } }
具體實現化角色:
public class CargoPlane extends AirPlane { @Override public void operate() { System.out.println(getAirPlaneMaker().getName() + "載貨的飛機"); } }
具體實現化角色:
public class PassengerPlane extends AirPlane { @Override public void operate() { System.out.println(getAirPlaneMaker().getName() + "載人的飛機"); } }
客戶端:
public class Client { public static void main(String[] args) { AirPlaneMaker airbus = new Airbus(); AirPlaneMaker boeing = new Boeing(); AirPlane passengerPlane = new PassengerPlane(); passengerPlane.setAirPlaneMaker(airbus); passengerPlane.operate(); passengerPlane.setAirPlaneMaker(boeing); passengerPlane.operate(); System.out.println(); AirPlane cargoPlane = new CargoPlane(); cargoPlane.setAirPlaneMaker(airbus); cargoPlane.operate(); cargoPlane.setAirPlaneMaker(boeing); cargoPlane.operate(); } }
輸出:
空中巴士載人的飛機
波音載人的飛機
空中巴士載貨的飛機
波音載貨的飛機
橋接模式使抽象化與實例化解耦。抽象化角色持有實現化角色的引用,經過傳入不一樣的實現化角色從而表現出不一樣的行爲。當有多個修正抽象化角色和多個具體實現化角色時,能夠經過組合不一樣的修正抽象化角色和具體實現化角色表現出不一樣的行爲。