小言_互联网的博客

简述设计模式(六)——桥接模式

389人阅读  评论(0)

问题

当一个类存在多个维度,并不同维度的改变都会衍生出一个新的子类。举个例子:形状类,其下有不同的图形,如三角形、正方形、圆形等等;此外,这些不同的形状还有不同颜色。如果使用传统的继承的方式的结构是这样的:

使用这种结构实现,存在以下缺点

  • 可扩展性差,存在类爆炸问题,增加维护成本;
  • 类的重复度高,违背单一职责原则;

**解决方案:**桥接模式。那么接下来先来了解桥接模式。

桥接模式

桥接模式是指将实现抽象放在两个不同的层次中,使两个层次可以独立改变。在解释定义之前,我们先画个UML类图

桥接模式中有以下角色定义:

  1. 抽象化角色:抽象类,包含一个实现化对象的引用;
    • 具体化抽象角色:抽象化角色的子类;
  2. 实现化角色:实现接口,供抽象化角色调用;
    • 具体化实现角色:实现化角色的实现类;

理解桥接模式,最重要的是理解什么是抽象化和实现化?

  • 抽象化:存在于多个实体中的共同的概念性联系。作为一个过程,抽象化就是忽略一些信息,从而把不同的实体当做同样的实体对待。

  • 实现化:抽象化给出的实现,是对抽象化的进一步具体化的产物。

可以这么理解:客户端期望获取的对象是抽象化角色对象;抽象化角色依赖实现化角色以获取具体的实现;

代码实现

基于文章开头所给的例子,使用桥接模式实现

  1. 实现化角色、具体实现化角色
//实现化角色
public interface Color {
    void showColor();
}

//具体实现化角色
public class Red implements Color {
    @Override
    public void showColor() {
        System.out.println("Red Color");
    }
}

public class Yellow implements Color {
    @Override
    public void showColor() {
        System.out.println("Yellow Color");
    }
}
  1. 抽象化角色、具体抽象化角色
//抽象化角色
public abstract class Shape {

    protected Color color;

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

    abstract void getShape();
}

//具体抽象化角色
public class Round extends Shape {

    public Round(Color color) {
        super(color);
    }

    @Override
    void getShape() {
        color.showColor();
        System.out.println("圆形形状");
    }
}

public class Square extends Shape {
    public Square(Color color) {
        super(color);
    }

    @Override
    void getShape() {
        color.showColor();
        System.out.println("正方形");
    }
}
  1. 客户端测试类
public class BridgeTest {
    public static void main(String[] args) {
        Red red = new Red();
        Yellow yellow = new Yellow();

        Round redRound = new Round(red);
        redRound.getShape();
        System.out.println("==================");
        Round yellowRound = new Round(yellow);
        yellowRound.getShape();

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

        Square redSquare = new Square(red);
        redSquare.getShape();
        System.out.println("==================");
        Square yellowSquare = new Square(yellow);
        yellowSquare.getShape();
    }
}

总结

  1. 抽象和实现分离,极大的提高了系统的灵活性;
  2. 抽象和实现可以独立扩展,互不干涉,实现解耦;
  3. 桥接模式的引入,增加了系统的理解和设计难度;

使用场景

对于由于多个维度继承导致系统类个数急剧增加的系统,适合使用桥接模式;常见的应用场景有:

  1. JDBC对应数据库的驱动程序;

  2. 银行转账系统
    转账分类:网上转账、柜台转账等;
    转账用户:普通、金卡等;

  3. 消息管理
    消息类型:即时消息、延时消息等;
    消息分类:邮件消息、手机消息等;

参考资料


转载:https://blog.csdn.net/qq_33736653/article/details/105941358
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场