桥接模式

桥接模式

定义

将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度

应用场景

使用场景,一个类中存在多个对象之间存在相互的引用关系,且这多个类都需要扩展
比如我有三个形状 长方形 正方形 圆形,三种颜色 白色 黑色 红色,然后需要根据这几个进行组合成比如黑色的长方形,红色的圆形等等,而且后续还需要扩展形状以及颜色
,那么这种组合关系就会有很多

优点

1.降低耦合度
2.有良好的扩展性

缺点

增加了系统理解的复杂程度,由于关系的建立是在抽象层,因此要进行抽象的设计以及编程

实现

需求 :有三个形状 长方形 正方形 圆形,三种颜色 白色 黑色 红色,然后需要根据这几个进行组合成比如黑色的长方形,红色的圆形等等

1 简单实现方式

直接实现,不考虑任何其他的场景

颜色类

黑色

public class Black {

    public String returnBlackColor() {
        return "black";
    }
}

红色

public class Red {

    public String returnRedColor() {
        return "red";
    }
}

白色

public class White {

    public String returnWhiteColor() {
        return "white";
    }
}
形状类

圆形

public class Circle {


   public void getRedCircle(Red red) {
      System.out.println(red.returnRedColor() + " circle");
   }

   public void getBlackCircle(Black black) {
      System.out.println(black.returnBlackColor() + " circle");
   }

   public void getWhiteCircle(White white) {
      System.out.println(white.returnWhiteColor() + " circle");
   }
}

长方形

public class Rectangle {

    public void getRedRectangle( Red red) {
        System.out.println(red.returnRedColor() + " rectangle");
    }

    public void getBlackRectangle(Black black) {
        System.out.println(black.returnBlackColor() + " rectangle");
    }

    public void getWhiteRectangle(White white) {
        System.out.println(white.returnWhiteColor() + " rectangle");
    }
}

正方形

public class Square {

    public void getRedSquare(Red red) {
        System.out.println(red.returnRedColor() + " square");
    }

    public void getBlackSquare(Black black) {
        System.out.println(black.returnBlackColor() + " square");

    }

    public void getWhiteSquare(White white) {
        System.out.println(white.returnWhiteColor() + " square");
    }
}

测试类
 public static void main(String[] args) {
        //获取红色的长方形
        Rectangle rectangle = new Rectangle();
        rectangle.getRedRectangle(new Red());

        //获取白色的圆
        Circle circle = new Circle();
        circle.getWhiteCircle(new White());
    }

这种方式会有下面的缺点
增加一种类型的颜色或者形状,需要增加很多方法,各自都需要增加内容以及方法,而且耦合度很强

2 优化实现方式

考虑到上面的颜色可以抽象出一个返回颜色的方法,因此可以将颜色抽象出一个接口放在形状中,简化代码

颜色类

抽象

public interface Color {

    String returnColor();
}

黑色

public class Black implements Color{

    public String returnBlackColor() {
        return "black";
    }

    @Override
    public String returnColor() {
        return "black";
    }
}

红色

public class Red implements Color{

    public String returnRedColor() {
        return "red";
    }

    @Override
    public String returnColor() {
        return "red";
    }
}

白色

public class White implements Color{

    public String returnWhiteColor() {
        return "white";
    }

    @Override
    public String returnColor() {
        return "white";
    }
}

形状类

圆形

public class Circle {


   public void getColorCircle(Color color) {
      System.out.println(color.returnColor()+ " circle");
   }
}

长方形

public class Rectangle {

    public void getColorRectangle( Color color) {
        System.out.println(color.returnColor() + " rectangle");
    }

}

正方形

public class Square {

    public void getColorSquare(Color color) {
        System.out.println(color.returnColor() + " square");
    }
}

测试类
public static void main(String[] args) {
        //获取红色的长方形
        Rectangle rectangle = new Rectangle();
        rectangle.getColorRectangle(new Red());

        //获取白色的圆
        Circle circle = new Circle();
        circle.getColorCircle(new White());
优化后

增加颜色类的时候不形状类里面不需要关注,基本可以实现后续增加形状或者颜色都不需要关注对方的改动,但是还是把颜色入侵到了形状里面,有一定的耦合度

3 使用桥接模式优化

颜色类

颜色接口

public interface Color {

    String returnColor();
}

黑色

public class Black implements Color{

    public String returnBlackColor() {
        return "black";
    }

    @Override
    public String returnColor() {
        return null;
    }
}

红色

public class Red implements Color {

    public String returnRedColor() {
        return "red";
    }

    @Override
    public String returnColor() {
        return "red";
    }
}

白色

public class White implements Color {

    public String returnWhiteColor() {
        return "white";
    }

    @Override
    public String returnColor() {
        return "white";
    }
}
形状类

抽象形状类

public abstract class Shape {

    Color color;

    public void setColor(Color color) {
        this.color = color;
    }

    public abstract void getColorShape();
}

圆形

public class Circle extends Shape{

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

长方形

public class Rectangle extends Shape {

    @Override
    public void getColorShape() {
        System.out.println(color.returnColor() + " rectangle");
    }
}

正方形

public class Square extends Shape {

    @Override
    public void getColorShape() {
        System.out.println(color.returnColor() + " square");
    }
}

测试类
public static void main(String[] args) {
        //获取红色的长方形
        Shape rectangle = new Rectangle();
        rectangle.setColor(new Red());
        rectangle.getColorShape();

        //获取白色的圆
        Shape circle = new Circle();
        circle.setColor(new White());
        circle.getColorShape();
    }
优化后

后续扩展添加颜色和形状都不会影响原有逻辑,具体的颜色和形状之间也没有直接的耦合了

##总结

桥接模式的使用可以减少类直接的耦合度,为后续的扩展提供方便,双方类如何变化都不会影响

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值