基于枚举实现的桥接模式
这里是基于枚举方式来维护的桥接模式,维护抽象化和实现化的关系。
桥接模式的应用场景:
当一个类内部具备两种或多种变化维度时,使用桥接模式可以解耦这些变化的维度,使高层代码架构稳定。
桥接模式通常适用于以下场景。
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("");});}
}
======= 输出桥接后的结果 =======
蓝色:手提包
红色:手提包
白色:手提包
粉色:手提包======= 输出桥接后的结果 =======
红色:双肩包
蓝色:双肩包
粉色:双肩包======= 输出桥接后的结果 =======
红色:腰包
蓝色:腰包
白色:腰包
总结
本文仅通过使用枚举的方式来来维护实例化接口、抽象化接口,同时使用枚举来维护抽象化和实例化之前的关系,通过扫描枚举的方式来获取到所有的抽象化和实例化桥接的结果。