定义: 将抽象与实现解耦,使得俩者可以独立的变化。这种模式将抽象部分与实现部分联系起来,就像是一座桥,将桥的两岸连接,构成一个整体。桥接模式是一种行为型设计模式。
桥接模式的4个模型角色:
- 抽象化角色模型: 抽象角色,持有实现化角色引用;
- 具体抽象化模型: 继承至抽象化角色,实现抽象化角色定义的方法逻辑并扩展自己本身的特性;
- 实现化角色模型: 通常声明为接口,提供对应的逻辑方法;
- 具体实现化角色模型: 对实现化角色中的逻辑方法提供具体的实现;
使用桥接模式实现一个简单案例。
场景:花园有很多不同种类,不同颜色的花,现在要了解花的颜色与种类。
分析:对于最顶层花的描述肯定是要抽象的,具体什么花通过继承可以实现,那么颜色这个描述就是实现化模型了。
代码示例:
//抽象化模型 - 花
public abstract class Flower {
private Color color;
public Flower(Color color) {
this.color = color;
}
public abstract String getFlower();
/**
* 声明一个公共部分的方法
* @return
*/
public void show() {
Log.d("TAG", "一朵" + color.getColor() + "的" + getFlower());
}
}
//实现化模型 -- 颜色
public interface Color {
String getColor();
}
具体化实现类(具体的颜色类型,例举2个)
public class Red implements Color {
@Override
public String getColor() {
return "红色";
}
}
public class White implements Color {
@Override
public String getColor() {
return "白色";
}
}
具体抽象化模型(具体的花类型,也是列举2个)
public class ChineseRose extends Flower {
public ChineseRose(Color color) {
super(color);
}
@Override
public String getFlower() {
return "月季";
}
}
public class Rose extends Flower {
public Rose(Color color) {
super(color);
}
@Override
public String getFlower() {
return "玫瑰";
}
}
以上四种模型均已完成,实际使用:
//红、白色的玫瑰
Rose rose1 = new Rose(new Red());
Rose rose2 = new Rose(new White());
rose1.show();
rose2.show();
//红、白色的月季
ChineseRose cRose1 = new ChineseRose(new Red());
ChineseRose cRose2 = new ChineseRose(new White());
cRose1.show();
cRose2.show();
应用场景:
- 如果设计上需要使得抽象角色与具体角色之间增加更多的灵活性,减少之前的联系,可以使用这种模式;
- 会因为多重继承关系导致系统类的个数急剧增加时,可以使用桥接模式;
- 一个类会有多种可以独立变化的维度(或属性方法,如例子上面的颜色,品种);
优点:
- 抽象与实现分离,使得它们可以独立变化提高灵活性,扩展能力强;
- 降低耦合;
- 有助于对面向对象的设计原则的理解,形成正确的设计思想,培养良好的设计风格;
小结
例子写的很简单,只是一个样本,不能够直观反映出桥接模式的特点。考虑到多维度情况,继承已经无法满足 需求了,就必须要使用到接口实现。抽象角色实现接口会使继承与实现关系太强,牵一发而动全身,影响其子类; 具体化实例实现这个接口,部分代码耦合度太高,代码累赘,复用性差,意义不大。桥接模式在抽象内部持有实现角色的实例将两者联系起来, 实现抽象与实现分离,两者互补影响,灵活度高。
来源:CSDN
作者:FooTyzZ
链接:https://blog.csdn.net/FooTyzZ/article/details/103972078