定义:如果某个类存在两个独立变化的维度,可以运用桥接模式将这两个维度分离出来,使两者可以独立扩展。与多层继承方案不同,它将两个独立变化的维度设计为两个独立的继承等级结构,并且在抽象层建立一个抽象关联,该关联关系就像一条桥一样
优点: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. }