• 基于枚举实现的桥接模式


    基于枚举实现的桥接模式

    这里是基于枚举方式来维护的桥接模式,维护抽象化和实现化的关系。



    提示:这里可以添加本文要记录的大概内容:

    例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


    提示:以下是本篇文章正文内容,下面案例可供参考

    一、实例化接口

    桥接模式的应用场景
    当一个类内部具备两种或多种变化维度时,使用桥接模式可以解耦这些变化的维度,使高层代码架构稳定。

    桥接模式通常适用于以下场景。
    1.当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
    2.当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
    3.当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。
    4.桥接模式的一个常见使用场景就是替换继承。我们知道,继承拥有很多优点,比如,抽象、封装、多态等,父类封装共性,子类实现特性。继承可以很好的实现代码复用(封装)的功能,但这也是继承的一大缺点。

    因为父类拥有的方法,子类也会继承得到,无论子类需不需要,这说明继承具备强侵入性(父类代码侵入子类),同时会导致子类臃肿

    1.1.实例化接口(颜色)

    代码如下(示例):

    package com.jareny.jave.design.bridge.impl;
    
    public interface Implementor {
    
        public void OperationImpl(String name);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    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;
    
        @Override
        public void OperationImpl(String name) {
            System.out.println(colourEnum.getDesc() +":"+ name);
        }
        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    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;
    
        @Override
        public void OperationImpl(String name) {
            System.out.println(colourEnum.getDesc() +":"+ name);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    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;
    
        @Override
        public void OperationImpl(String name) {
            System.out.println(colourEnum.getDesc() +":"+ name);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    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;
    
        @Override
        public void OperationImpl(String name) {
            System.out.println(colourEnum.getDesc() +":"+ name);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    二、使用枚举维护实例化接口

    代码如下(示例):

    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("蓝色"){
            @Override
            public Implementor getImplementor() {
                return new BueImplementor();
            }
        },
    
        Red("红色"){
            @Override
            public Implementor getImplementor() {
                return new RedImplementor();
            }
        },
    
        White("白色"){
            @Override
            public Implementor getImplementor() {
                return new WhiteImplmentor();
            }
        },
    
        Pink("粉色"){
            @Override
            public Implementor getImplementor() {
                return new PinkImplementor();
            }
        },
        ;
    
        // 描述
        private String desc;
        
        public abstract Implementor getImplementor();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    三、抽象化接口(包的款式)

    用桥接(Bridge)模式模拟女士皮包的选购。

    女士皮包有很多种,可以按用途分、按皮质分、按品牌分、按颜色分、按大小分等,存在多个维度的变化,所以采用桥接模式来实现女士皮包的选购比较合适。

    本实例按用途分可选钱包(Wallet)和挎包(HandBag),按颜色分可选黄色(Yellow)和红色(Red)。可以按两个维度定义为颜色类和包类。

    颜色类(Color)是一个维度,定义为实现化角色,它有两个具体实现化角色:黄色和红色,通过 getColor() 方法可以选择颜色;包类(Bag)是另一个维度,定义为抽象化角色,它有两个扩展抽象化角色:挎包和钱包,它包含了颜色类对象,通过 getName() 方法可以选择相关颜色的挎包和钱包。

    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());
        }
    
        @Override
        public void Operation() {
            // 桥接操作
            for (Implementor imple : implementorList) {
                imple.OperationImpl(bagsEnum.getName());
            }
        }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    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());
        }
    
        @Override
        public void Operation() {
            // 桥接操作
            for (Implementor imple : implementorList) {
                imple.OperationImpl(bagsEnum.getName());
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    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());
        }
    
        @Override
        public void Operation() {
            // 桥接操作
            for (Implementor imple : implementorList) {
                imple.OperationImpl(bagsEnum.getName());
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    四、使用枚举维护抽象化接口

    代码如下(示例):

    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("手提包"){
            @Override
            public Abstraction getAbstraction() {
                return new HandbagAbstraction();
            }
    
            @Override
            public List getColourList() {
                return Lists.newArrayList(ColourEnum.values());
            }
        },
    
        Backpack("双肩包"){
            @Override
            public Abstraction getAbstraction() {
                return new BackpackAbstraction();
            }
            @Override
            public List getColourList() {
                return Lists.newArrayList(ColourEnum.Red,ColourEnum.Blue,ColourEnum.Pink);
            }
        },
    
        FannyPack("腰包"){
            @Override
            public Abstraction getAbstraction() {
                return new FannyPackAbstraction();
            }
            @Override
            public List getColourList() {
                return Lists.newArrayList(ColourEnum.Red,ColourEnum.Blue,ColourEnum.White);
            }
        },
        ;
    
        private String name;
    
        // 获取抽象
        public abstract Abstraction getAbstraction();
    
        // 获取实现化列表
        public abstract List getColourList();
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    五、使用枚举实现的桥接设计测试

    运行结果

    ======= 输出桥接后的结果 ======= 
    蓝色:手提包
    红色:手提包
    白色:手提包
    粉色:手提包
    
    ======= 输出桥接后的结果 ======= 
    红色:双肩包
    蓝色:双肩包
    粉色:双肩包
    
    ======= 输出桥接后的结果 ======= 
    红色:腰包
    蓝色:腰包
    白色:腰包
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    总结

    以上就是今天要讲的内容,本文仅通过使用枚举的方式来来维护实例化接口、抽象化接口,同时使用枚举来维护抽象化和实例化之前的关系,通过扫描枚举的方式来获取到所有的抽象化和实例化桥接的结果。

  • 相关阅读:
    java需要用到的工具类/方法(持续更新)
    野火A7学习第七次(分频器相关)
    Java生态系统的进化:从JDK 1.0到今天
    云行 | 加码算力网络布局,天翼云发布南京3AZ节点
    5G WiFi 安信可 BW16 模组 RTL8720DN 入门笔记 2:Linux 搭建二次开发SDK开发环境,点亮一盏LED灯。
    JavaScript 中 数组(Array)的 pop/push, shift/unshift 方法以及性能比较
    git 申请合并冲突:rebase 解决合成一条再成功合并
    SOLIDWORKS二次开发——拓展设计能力与定制化解决方案
    【springboot】3、自动配置
    Spring Authorization Server(AS)从 Mysql 中读取客户端、用户
  • 原文地址:https://blog.csdn.net/weixin_39956506/article/details/134485574