定义:如果某个类存在两个独立变化的维度,可以运用桥接模式将这两个维度分离出来,使两者可以独立扩展。与多层继承方案不同,它将两个独立变化的维度设计为两个独立的继承等级结构,并且在抽象层建立一个抽象关联,该关联关系就像一条桥一样
优点:1.分离抽象接口及其实现部分。提高了比继承更好的解决方案。
2.子类的数目减少了。
3.桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
缺点:1.提高了系统的复杂度。
使用场景:1.一个类需要在两个以上维度扩展,采用继承方式会导致子类数量过多
例.如果一个类在两个维度分别有m和n种变化,采用继承的方式就需要扩展出m*n个子类,且一个维度每增加一种变化就多出另一个维度变化总数的子类;如果将两个维度拆分再组合,加起来也只有m+n个子类,且每个维度独立扩展,一个维度增加一种变化只需要增加1个子类。
对比图:原

通用代码:
第一个维度接口
1. public interface Implementor {
2. void operationImpl();
3. }
第一个维度实现
1. public class ConcreteImplementor implements Implementor {
2. public void operationImpl() {
3. //todo
4. }
5. }
第二个维度(为抽象类,将第一个维度注入)
1. public abstract class Abstraction {
2. protected Implementor impl; //实现类接口
3.
4. public void setImpl(Implementor impl){
5. this.impl = impl;
6. }
7.
8. public abstract void operation(); //声明抽象业务方法
9. }
第二个维度的实现
1. public class RefinedAbstraction extends Abstraction {
2. public void operation() {
3. //todo
4. impl.operationImpl();
5. //todo
6. }
7. }
栗子
1. public interface BallType{
2.
3. public void ballType();
4.
5. }
实现
1. public class Basketball implements BallType{
2.
3. public void ballType(String color){
4. system.out.print(color+"的篮球")
5. }
6.
7. }
1. public class Football implements BallType{
2.
3. public void ballType(String color){
4. system.out.print(color+"的足球")
5. }
6.
7. }
1. public class Volleyball implements BallType{
2.
3. public void ballType(String color){
4. system.out.print(color+"的排球")
5. }
6.
7. }
第二个维度的抽象类
1. public abstract class Color{
2. BallType ballType;
3.
4. public void setBallType(BallType ballType) {
5. this.ballType = ballType;
6. }
7.
8. public abstract void color();
9. }
1. public class Red extends Color{
2.
3. public void color() {
4. ballType.ballType("红色");
5. }
6. }
调用
1. public class Client {
2. public static void main(String[] args) {
3. /足球
4. BallType type = new Football();
5. //红色
6. Red red = new Red();
7. //红色足球
8. red.setBallType(type);
9. red.color();
10.
11. }
12. }