当前位置: 首页 > article >正文

基于枚举实现的桥接模式

基于枚举实现的桥接模式

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

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

桥接模式通常适用于以下场景。
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;

    @Override
    public 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;

    @Override
    public 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;

    @Override
    public 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;

    @Override
    public 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("蓝色"){
        @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();
}

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

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());
        }
    }
}


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());
        }
    }
}

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());
        }
    }
}

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

代码如下(示例):

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<ColourEnum> getColourList() {
            return Lists.newArrayList(ColourEnum.values());
        }
    },

    Backpack("双肩包"){
        @Override
        public Abstraction getAbstraction() {
            return new BackpackAbstraction();
        }
        @Override
        public List<ColourEnum> getColourList() {
            return Lists.newArrayList(ColourEnum.Red,ColourEnum.Blue,ColourEnum.Pink);
        }
    },

    FannyPack("腰包"){
        @Override
        public Abstraction getAbstraction() {
            return new FannyPackAbstraction();
        }
        @Override
        public List<ColourEnum> getColourList() {
            return Lists.newArrayList(ColourEnum.Red,ColourEnum.Blue,ColourEnum.White);
        }
    },
    ;

    private String name;

    // 获取抽象
    public abstract Abstraction getAbstraction();

    // 获取实现化列表
    public abstract List<ColourEnum> getColourList();

}

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

运行结果

======= 输出桥接后的结果 ======= 
蓝色:手提包
红色:手提包
白色:手提包
粉色:手提包

======= 输出桥接后的结果 ======= 
红色:双肩包
蓝色:双肩包
粉色:双肩包

======= 输出桥接后的结果 ======= 
红色:腰包
蓝色:腰包
白色:腰包

总结

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


http://www.kler.cn/a/133458.html

相关文章:

  • 入侵排查之Linux
  • C++常用的新特性-->day06
  • 如何在手机上完整下载B站视频并保存到相册?
  • 【CSS】什么是BFC?
  • C++单例模式与多例模式
  • 鸿蒙next版开发:相机开发-适配不同折叠状态的摄像头变更(ArkTS)
  • 物联网赋能:WIFI HaLow在无线连接中的优势
  • java 实现串口通讯
  • 将word中的表格无变形的弄进excel中
  • 论文阅读:JINA EMBEDDINGS: A Novel Set of High-Performance Sentence Embedding Models
  • 开发一款小程序游戏需要多少钱?
  • 【uniapp/uview1.x】u-upload 在 v-for 中的使用时, before-upload 如何传参
  • Redis7.2.3集群安装,新增节点,删除节点,分配哈希槽,常见问题
  • 【Linux】21、软中断、网络小包、SYN FLOOD 攻击、sar tcpdump
  • C语言-统计字符
  • 使用Golang调用摄像头
  • React新手必懂的知识点
  • Zabbix Proxy分布式监控
  • 大数据学习(22)-spark
  • C# WPF Threads 和 Dispatchers 有什么区别
  • 聊聊logback的MDCFilter
  • Java编程技巧:将图片导出成pdf文件
  • Linux | 信号
  • 【done】剑指offer68:二叉树最近公共祖先
  • IDEA远程一键部署SpringBoot到Docker
  • OpenAI GPT5计划泄露