对桥接模式的理解

目录

一、背景

  • 在《对装饰器模式的理解》中,当我们想基于某个类做扩展时,我们不是采用继承而是组合的方式。这样,可以避免子类爆炸的问题。
    • 想象一下俄罗斯套娃,类与类之间的结果也类似。
  • 还有一种场景:
    • 如果采用继承的方式,例如,类型AB1、类型AB2等,也会导致子类爆炸。
    • 那怎么解决呢? --> 依然是组合

二、桥接模式的demo

1、类型A(形状类型)

java 复制代码
public interface Shape {
    void draw();
}

public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("circle");
    }
}

public class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("square");
    }
}

2、类型B(颜色类型)

java 复制代码
public interface Color {
    void fill();
}

public class RedColor implements Color {
    @Override
    public String fill() {
        return "red";
    }
}

public class BlueColor implements Color {
    @Override
    public String fill() {
       return "blue";
    }
}

3、需求:类型A要使用类型B(如:红色的方形)

  • 将类型A和类型B桥接起来。(本质上就是组合)

装饰器模式,是同一接口(同一抽象)的组合。

桥接模式,是不同接口(不同抽象)的组合。

  • 实现:
java 复制代码
public class Circle implements Shape {
    private Color color;

    public Circle(Color color) {
        this.color = color;
    }

    @Override
    public void draw() {
        System.out.println(color.fill() + " circle");
    }
}

public class Square implements Shape {
    private Color color;

    public Square(Color color) {
        this.color = color;
    }

    @Override
    public void draw() {
//        System.out.println("square");
        System.out.println(color.fill() + " square");
    }
}
java 复制代码
public class Application {
    public static void main(String[] args) {
        Shape redCircle = new Circle(new RedColor());
        redCircle.draw();

        Shape blueCircle = new Circle(new BlueColor());
        blueCircle.draw();

        System.out.println("-------------------------------");

        Square redSquare = new Square(new RedColor());
        redSquare.draw();

        Square blueSquare = new Square(new BlueColor());
        blueSquare.draw();
    }
}

4、Spring的方式

实际开发中,我们希望Spring帮我们组织好bean,我们拿来就用即可。

java 复制代码
@Configuration
public class ShapeConfig {
    @Bean
    public Color blueColor() {
        return new BlueColor();
    }

    @Bean
    public Color redColor() {
        return new RedColor();
    }

    @Bean
    public Square blueSquare(@Qualifier("blueColor") Color blueColor) {
        return new Square(blueColor);
    }

    @Bean
    public Square redSquare(@Qualifier("redColor") Color redColor) {
        return new Square(redColor);
    }

    @Bean
    public Circle blueCircle(@Qualifier("blueColor") Color blueColor) {
        return new Circle(blueColor);
    }

    @Bean
    public Circle redCircle(@Qualifier("redColor") Color redColor) {
        return new Circle(redColor);
    }
}
java 复制代码
@ComponentScan
public class Application {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Application.class);
        Circle blueCircle = applicationContext.getBean("blueCircle", Circle.class);
        blueCircle.draw();

        Circle redCircle = applicationContext.getBean("redCircle", Circle.class);
        redCircle.draw();

        System.out.println("--------------------------------------------------------------------------------");
        Square blueSquare = applicationContext.getBean("blueSquare", Square.class);
        blueSquare.draw();

        Square redSquare = applicationContext.getBean("redSquare", Square.class);
        redSquare.draw();

        applicationContext.close();
    }
}
相关推荐
Miraitowa_cheems17 分钟前
LeetCode算法日记 - Day 81: 最大子数组和
java·数据结构·算法·leetcode·决策树·职场和发展·深度优先
CodeCraft Studio22 分钟前
国产化Word处理控件Spire.Doc教程:用Java实现TXT文本与Word互转的完整教程
java·c#·word·spire.doc·word文档转换·txt转word·word转txt
徐子童29 分钟前
数据结构---优先级队列(堆)
java·数据结构·面试题·优先级队列··topk问题
滑水滑成滑头34 分钟前
**标题:发散创新:智能交通系统的深度探究与实现**摘要:本文将详细
java·人工智能·python
siriuuus1 小时前
Maven 核心概念及生命周期
java·maven
闭着眼睛学算法1 小时前
【双机位A卷】华为OD笔试之【哈希表】双机位A-跳房子I【Py/Java/C++/C/JS/Go六种语言】【欧弟算法】全网注释最详细分类最全的华子OD真题题解
java·c语言·c++·python·算法·华为od·散列表
孔明兴汉1 小时前
Cursor MCP 第一章-第一节-MCP协议简介.md
java·ai
信仰_2739932431 小时前
枚举类Enum反编译后效果
java·开发语言
TDengine (老段)1 小时前
TDengine 数学函数 LOG 用户手册
java·大数据·数据库·时序数据库·iot·tdengine·涛思数据
青皮桔1 小时前
Java+OpenCV实现图片切割
java·后端·opencv·计算机视觉