基于枚舉實現的橋接模式
這里是基于枚舉方式來維護的橋接模式,維護抽象化和實現化的關系。
橋接模式的應用場景:
當一個類內部具備兩種或多種變化維度時,使用橋接模式可以解耦這些變化的維度,使高層代碼架構穩定。
橋接模式通常適用于以下場景。
1.當一個類存在兩個獨立變化的維度,且這兩個維度都需要進行擴展時。
2.當一個系統不希望使用繼承或因為多層次繼承導致系統類的個數急劇增加時。
3.當一個系統需要在構件的抽象化角色和具體化角色之間增加更多的靈活性時。
4.橋接模式的一個常見使用場景就是替換繼承。我們知道,繼承擁有很多優點,比如,抽象、封裝、多態等,父類封裝共性,子類實現特性。繼承可以很好的實現代碼復用(封裝)的功能,但這也是繼承的一大缺點。因為父類擁有的方法,子類也會繼承得到,無論子類需不需要,這說明繼承具備強侵入性(父類代碼侵入子類),同時會導致子類臃腫。
文章目錄
- 基于枚舉實現的橋接模式
- 前言
- 一、實例化接口
- 1.1.實例化接口(顏色)
- 1.2. 藍色實現實例化接口(藍色)
- 1.3. 紅色實現實例化接口(紅色)
- 1.4.白色實現實例化接口(白色)
- 1.5.粉色實現實例化接口(粉色)
- 二、使用枚舉維護實例化接口
- 三、抽象化接口(包的款式)
- 3.1.雙肩包實現抽象化接口(雙肩包)
- 3.2.腰包實現抽象化接口(腰包)
- 3.3.手提包實現抽象化接口(手提包)
- 四、使用枚舉維護抽象化接口
- 五、使用枚舉實現的橋接設計測試
- 總結
前言
用橋接(Bridge)模式模擬女士皮包的選購。
1.女士皮包有很多種,可以按用途分、按皮質分、按品牌分、按顏色分、按大小分等,存在多個維度的變化,所以采用橋接模式來實現女士皮包的選購比較合適。
2.本實例按用途分可選腰包(FannyPack)和手提包(HandBag),按顏色分可選藍色(Bule)和紅色(Red)。可以按兩個維度定義為顏色類和包類。
顏色類(Color)是一個維度,定義為實現化角色,它有兩個具體實現化角色:黃色和紅色,通過getDesc()方法可以選擇顏色;包類(Bag)是另一個維度,定義為抽象化角色,它有兩個擴展抽象化角色:挎包和錢包,它包含了顏色類對象,通過getName() 方法可以選擇相關顏色的挎包和錢包。
一、實例化接口
1.1.實例化接口(顏色)
代碼如下(示例):
package com.jareny.jave.design.bridge.impl;public interface Implementor {public void OperationImpl(String name);}
1.2. 藍色實現實例化接口(藍色)
代碼如下(示例):
package com.jareny.jave.design.bridge.impl;import com.jareny.jave.design.bridge.enums.ColourEnum;public class BueImplementor implements Implementor {// 指定 顏色的類型private ColourEnum colourEnum = ColourEnum.Blue;@Overridepublic void OperationImpl(String name) {System.out.println(colourEnum.getDesc() +":"+ name);}}
1.3. 紅色實現實例化接口(紅色)
代碼如下(示例):
package com.jareny.jave.design.bridge.impl;import com.jareny.jave.design.bridge.enums.ColourEnum;public class RedImplementor implements Implementor {// 指定 顏色的類型private ColourEnum colourEnum = ColourEnum.Red;@Overridepublic void OperationImpl(String name) {System.out.println(colourEnum.getDesc() +":"+ name);}
}
1.4.白色實現實例化接口(白色)
代碼如下(示例):
package com.jareny.jave.design.bridge.impl;import com.jareny.jave.design.bridge.enums.ColourEnum;public class WhiteImplmentor implements Implementor {// 指定 顏色的類型private ColourEnum colourEnum = ColourEnum.White;@Overridepublic void OperationImpl(String name) {System.out.println(colourEnum.getDesc() +":"+ name);}
}
1.5.粉色實現實例化接口(粉色)
代碼如下(示例):
package com.jareny.jave.design.bridge.impl;import com.jareny.jave.design.bridge.enums.ColourEnum;public class PinkImplementor implements Implementor {// 指定 顏色的類型private ColourEnum colourEnum = ColourEnum.Pink;@Overridepublic void OperationImpl(String name) {System.out.println(colourEnum.getDesc() +":"+ name);}
}
二、使用枚舉維護實例化接口
代碼如下(示例):
package com.jareny.jave.design.bridge.enums;import com.jareny.jave.design.bridge.impl.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;/*** 顏色*/
@Getter
@NoArgsConstructor
@AllArgsConstructor
public enum ColourEnum {/*** 顏色分類*/Blue("藍色"){@Overridepublic Implementor getImplementor() {return new BueImplementor();}},Red("紅色"){@Overridepublic Implementor getImplementor() {return new RedImplementor();}},White("白色"){@Overridepublic Implementor getImplementor() {return new WhiteImplmentor();}},Pink("粉色"){@Overridepublic Implementor getImplementor() {return new PinkImplementor();}},;// 描述private String desc;public abstract Implementor getImplementor();
}
三、抽象化接口(包的款式)
3.1.雙肩包實現抽象化接口(雙肩包)
代碼如下(示例):
package com.jareny.jave.design.bridge.abstraction;import com.jareny.jave.design.bridge.enums.BagsEnum;
import com.jareny.jave.design.bridge.enums.ColourEnum;
import com.jareny.jave.design.bridge.impl.Implementor;
import java.util.stream.Collectors;public class BackpackAbstraction extends Abstraction {// 指定 枚舉類型BagsEnum bagsEnum = BagsEnum.Backpack;public BackpackAbstraction() {this.implementorList = bagsEnum.getColourList().stream().map(ColourEnum::getImplementor).collect(Collectors.toList());}@Overridepublic void Operation() {// 橋接操作for (Implementor imple : implementorList) {imple.OperationImpl(bagsEnum.getName());}}
}
3.2.腰包實現抽象化接口(腰包)
代碼如下(示例):
package com.jareny.jave.design.bridge.abstraction;import com.jareny.jave.design.bridge.enums.BagsEnum;
import com.jareny.jave.design.bridge.enums.ColourEnum;
import com.jareny.jave.design.bridge.impl.Implementor;
import java.util.stream.Collectors;public class FannyPackAbstraction extends Abstraction {// 指定 枚舉類型BagsEnum bagsEnum = BagsEnum.FannyPack;public FannyPackAbstraction() {this.implementorList = bagsEnum.getColourList().stream().map(ColourEnum::getImplementor).collect(Collectors.toList());}@Overridepublic void Operation() {// 橋接操作for (Implementor imple : implementorList) {imple.OperationImpl(bagsEnum.getName());}}
}
3.3.手提包實現抽象化接口(手提包)
代碼如下(示例):
package com.jareny.jave.design.bridge.abstraction;import com.jareny.jave.design.bridge.enums.BagsEnum;
import com.jareny.jave.design.bridge.enums.ColourEnum;
import com.jareny.jave.design.bridge.impl.Implementor;
import java.util.stream.Collectors;public class HandbagAbstraction extends Abstraction {// 指定 枚舉類型BagsEnum bagsEnum = BagsEnum.Handbag;public HandbagAbstraction() {this.implementorList = bagsEnum.getColourList().stream().map(ColourEnum::getImplementor).collect(Collectors.toList());}@Overridepublic void Operation() {// 橋接操作for (Implementor imple : implementorList) {imple.OperationImpl(bagsEnum.getName());}}
}
四、使用枚舉維護抽象化接口
代碼如下(示例):
package com.jareny.jave.design.bridge.enums;import com.google.common.collect.Lists;
import com.jareny.jave.design.bridge.abstraction.Abstraction;
import com.jareny.jave.design.bridge.abstraction.BackpackAbstraction;
import com.jareny.jave.design.bridge.abstraction.FannyPackAbstraction;
import com.jareny.jave.design.bridge.abstraction.HandbagAbstraction;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import java.util.List;@Getter
@NoArgsConstructor
@AllArgsConstructor
public enum BagsEnum {/*** 包分類*/Handbag("手提包"){@Overridepublic Abstraction getAbstraction() {return new HandbagAbstraction();}@Overridepublic List<ColourEnum> getColourList() {return Lists.newArrayList(ColourEnum.values());}},Backpack("雙肩包"){@Overridepublic Abstraction getAbstraction() {return new BackpackAbstraction();}@Overridepublic List<ColourEnum> getColourList() {return Lists.newArrayList(ColourEnum.Red,ColourEnum.Blue,ColourEnum.Pink);}},FannyPack("腰包"){@Overridepublic Abstraction getAbstraction() {return new FannyPackAbstraction();}@Overridepublic List<ColourEnum> getColourList() {return Lists.newArrayList(ColourEnum.Red,ColourEnum.Blue,ColourEnum.White);}},;private String name;// 獲取抽象public abstract Abstraction getAbstraction();// 獲取實現化列表public abstract List<ColourEnum> getColourList();}
五、使用枚舉實現的橋接設計測試
運行結果
package com.jareny.jave.design.bridge;import com.jareny.jave.design.bridge.abstraction.Abstraction;
import com.jareny.jave.design.bridge.enums.BagsEnum;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;public class BridgeExample {public static void main(String[] args) {// 獲取所有抽象化列表List<Abstraction> abstractionList = Stream.of(BagsEnum.values()).map(BagsEnum::getAbstraction).collect(Collectors.toList());// 所有抽象化列表開始操作abstractionList.forEach(abstraction ->{System.out.println("======= 輸出橋接后的結果 ======= ");abstraction.Operation();System.out.println("");});}
}
======= 輸出橋接后的結果 =======
藍色:手提包
紅色:手提包
白色:手提包
粉色:手提包======= 輸出橋接后的結果 =======
紅色:雙肩包
藍色:雙肩包
粉色:雙肩包======= 輸出橋接后的結果 =======
紅色:腰包
藍色:腰包
白色:腰包
總結
本文僅通過使用枚舉的方式來來維護實例化接口、抽象化接口,同時使用枚舉來維護抽象化和實例化之前的關系,通過掃描枚舉的方式來獲取到所有的抽象化和實例化橋接的結果。