结构型模式 - 桥接模式(多个维度变量独立变化)

桥接模式(Bridge Pattern)

意图

将抽象部分与实现部分分离,使得它们都可以独立变化。

适用场景

一个类如果有2个维度或者多个维度的扩展,用继承没有问题,但是用桥接模式会更适合。避免2个层次之间建立静态继承联系。

  • 什么是抽象部分,什么是实现部分?
    比如,要绘制矩形、圆形、正方形,至少需要3个形状类,但是如果绘制的图形有不同颜色,如红色、蓝色、绿色灯,需要为每个形状类又继承3个子类。这样就要扩展3+9个类。
    这里的形状是抽象,具体的实现矩形、圆形、正方形;另外一个就是颜色,具体的实现就是红蓝绿色。桥接模式就是使形状和颜色能独立的变化,不会出现每修改一个颜色,都要影响形状类的变化;同样地,修改形状,也不会影响颜色的变化。不至于出现红色矩形类、蓝色圆形类、绿色正方形类,这样颜色和形状就没有分离。

另外一种好的方案是,将形状和颜色分离,也就是将形状、颜色从继承关系转换为关联关系。

适配器模式 vs 桥接模式

桥接模式适用于系统的初步设计,对存在两个独立变化维度的类可以将其分为抽象化和实现化两个角色,使他们可以分别进变化。在初步设计完成后,发现系统已有类无法协同工作时,可以用适配器模式,解决接口不兼容问题,特别是涉及到第三方应用接口的情况。

UML类图

实现代码

  1. 创建接口Color
// Color.java
public interface Color {
    public void bepaint();
}
  1. 创建接口Color实现类,Red, Green, Blue
// Red.java
public class Red implements Color{
    public void bepaint()
    {
        System.out.println("Color is Red ");
    }
}

// Green.java
public class Green implements Color{
    public void bepaint()
    {
        System.out.println("Color is Green ");
    }
}

// Blue.java
public class Blue implements Color{
    public void bepaint()
    {
        System.out.println("Color is Blue ");
    }
}
  1. 使用Color接口创建抽象类Shape
// Shape.java
public abstract class Shape {
    protected Color color;
    
    public Shape(Color color)
    {
        this.color = color;
    }

    public abstract void draw();
}
  1. 创建实现了Shape的实体类Circle, Retangle, Square
// Circle.java
public class Circle extends Shape {
    @Override
    public void draw()    {
        System.out.println("Shape is Circle");
        color.bepaint();
    }
}

// Retangle.java
public class Retangle extends Shape {
    @Override
    public void draw()
    {
        System.out.println("Shape is Retangle");
        color.bepaint();
    }
}

// Square.java
public class Square extends Shape {
    @Override
    public void draw()
    {
        System.out.println("Shape is Square");
        color.bepaint();
    }
}
  1. 创建BridgePatternDemo,绘制不同颜色的Shape
// BridgePatternDemo.java
public class BridgePatternDemo{
    public static void main(String[] args) {
        Shape redCircle = new Circle(new Red());
        Shape blueSquare = new Square(new Blue());
        redCircle.draw();
        System.out.println("===");
        blueSquare.draw();                
    }
}

运行结果

Shape is Circle
Color is Red
===
Shape is Square
Color is Blue
posted @ 2021-01-11 23:58  明明1109  阅读(445)  评论(0编辑  收藏  举报