桥接模式(Bridge):将抽象部分与实现部分分离,使它们都可以独立的变化。
一、桥接模式
我们知道java的四个特性:封装、继承、多态、抽象。以继承为例,在一家衣服店,有很多类型的衣服,有T-shirt,短裤,夹克…..,而不同类型的衣服,又有不同的颜色,比如:红色、绿色、黑色……。按照继承的思想,我们可以这样理解:
但假如,该商店要加入另一种新的类型的衣服时,还得加三种不同的颜色。我们将每一种衣服增加新的颜色时,就要加入新的类型的衣服了。针对这样的结果,我们可以换个解决方法:
我们不再用继承的方式解决多维度的问题,而是采用关联的方式来增加不同组合可能性。这就是今天我们要学习的桥接模式。
桥接模式:将抽象部分与实现部分分离,使它们都可以独立的变化。
桥接模式将继承关系转化成关联关系,它降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量。桥接模式的UML图如下:
桥接模式主要有以下部分组成:
Abstraction:抽象类,即桥接类。
RefinedAbstraction:扩充抽象类。
Implementor:实现类接口。
ConcreteImplementor:具体实现类 。
二、案列分析
我们以开篇介绍的例子,编写桥接模式的案列代码:
定义Clothes,衣服抽象类,作为Abstraction,桥接类:
abstract class Clothes {
Color color = null;
public void setColor(Color color) {
this.color = color;
}
public abstract void type();
}
RefinedAbstraction: 继承Clothes
class T_shirt extends Clothes {
public void type() {
System.out.println("T-shirt");
}
}
class Jack extends Clothes {
public void type() {
System.out.println("Jack");
}
}
class Pants extends Clothes {
public void type() {
System.out.println("Pants");
}
}
Implementor : Color接口
interface Color {
public void style();
}
ConcreteImplementor:具体Color实现类
class Red implements Color {
public void style() {
System.out.print("我是红色的");
}
}
class Green implements Color {
public void style() {
System.out.print("我是绿色的");
}
}
class Blue implements Color {
public void style() {
System.out.print("我是蓝色的");
}
}
客户端调用:
public class Test {
public static void main(String[] args) {
// 红色T-shirt
Color c = new Red();
Clothes clothes =new T_shirt();
clothes.setColor(c);
c.style();
clothes.type();
//蓝色裤子
Color c1 = new Blue();
Clothes clothes1 =new Pants();
clothes1.setColor(c1);
c1.style();
clothes1.type();
}
}
运行结果(代码亲测可以通过):
代码地址:Bridge
当我们要增加一种新的衣服类型,或者新增一种颜色的时候,只要各自去继承自己的抽象类,在客户端关联即可。
三、模式总结
(一)桥接模式的特点:
分离抽象接口及其实现部分。提高了比继承更好的解决方案,提高了系统的可扩展性。
桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
实现细节对客户透明,可以对用户隐藏实现细节。
(二) 桥接模式的使用场景
如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。
一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。
对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
欢迎大家评论留言,点击查看更多设计模式。