问题
当一个类存在多个维度,并不同维度的改变都会衍生出一个新的子类。举个例子:形状类,其下有不同的图形,如三角形、正方形、圆形等等;此外,这些不同的形状还有不同颜色。如果使用传统的继承的方式的结构是这样的:
使用这种结构实现,存在以下缺点:
- 可扩展性差,存在类爆炸问题,增加维护成本;
- 类的重复度高,违背单一职责原则;
**解决方案:**桥接模式。那么接下来先来了解桥接模式。
桥接模式
桥接模式是指将实现和抽象放在两个不同的层次中,使两个层次可以独立改变。在解释定义之前,我们先画个UML类图
桥接模式中有以下角色定义:
- 抽象化角色:抽象类,包含一个实现化对象的引用;
- 具体化抽象角色:抽象化角色的子类;
- 实现化角色:实现接口,供抽象化角色调用;
- 具体化实现角色:实现化角色的实现类;
理解桥接模式,最重要的是理解什么是抽象化和实现化?
-
抽象化:存在于多个实体中的共同的概念性联系。作为一个过程,抽象化就是忽略一些信息,从而把不同的实体当做同样的实体对待。
-
实现化:抽象化给出的实现,是对抽象化的进一步具体化的产物。
可以这么理解:客户端期望获取的对象是抽象化角色对象;抽象化角色依赖实现化角色以获取具体的实现;
代码实现
基于文章开头所给的例子,使用桥接模式实现
- 实现化角色、具体实现化角色
//实现化角色
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");
}
}
- 抽象化角色、具体抽象化角色
//抽象化角色
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("正方形");
}
}
- 客户端测试类
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();
}
}
总结
- 抽象和实现分离,极大的提高了系统的灵活性;
- 抽象和实现可以独立扩展,互不干涉,实现解耦;
- 桥接模式的引入,增加了系统的理解和设计难度;
使用场景
对于由于多个维度继承导致系统类个数急剧增加的系统,适合使用桥接模式;常见的应用场景有:
-
JDBC对应数据库的驱动程序;
-
银行转账系统
转账分类:网上转账、柜台转账等;
转账用户:普通、金卡等; -
消息管理
消息类型:即时消息、延时消息等;
消息分类:邮件消息、手机消息等;
参考资料
转载:https://blog.csdn.net/qq_33736653/article/details/105941358
查看评论