桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
意图:将抽象部分与实现部分分离,使它们都可以独立的变化。
主要解决:在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。
何时使用:实现系统可能有多个角度分类,每一种角度都可能变化。
如何解决:把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合。
关键代码:抽象类依赖实现类。
优点: 1、抽象和实现的分离。 2、优秀的扩展能力。 3、实现细节对客户透明。
缺点:桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
桥接模式通常适用于以下场景:
1.当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
2.当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
3.当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。
桥接(Bridge)模式包含以下主要角色:
抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。
实现:
![](https://img-blog.csdnimg.cn/20190118155359453.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxNTk0OTEzODAx,size_16,color_FFFFFF,t_70)
/**
*
* @ClassName: Shell
* @Description: 手机壳:实现化角色的接口,供扩展抽象化角色调用
* @author: ljx
* @date: 2019年1月18日 下午3:06:58
*/
public interface Shell {
public void color();
}
/**
*
* @ClassName: YellowShello
* @Description: 黄色手机壳:给出实现化角色接口的具体实现
* @author: ljx
* @date: 2019年1月18日 下午3:09:35
*/
public class YellowShello implements Shell{
@Override
public void color() {
System.out.println("黄色手机壳");
}
}
/**
*
* @ClassName: RedShell
* @Description: 红色手机壳:给出实现化角色接口的具体实现
* @author: ljx
* @date: 2019年1月18日 下午3:10:43
*/
public class RedShell implements Shell {
@Override
public void color() {
System.out.println("红色手机壳");
}
}
/**
*
* @ClassName: Phone
* @Description: 抽象部分:手机
* @author: ljx
* @date: 2019年1月18日 下午3:12:00
*/
public abstract class Phone {
protected Shell shell;// 持有一个实现部分对象,形成聚合关系
public Phone(Shell shell){
this.shell = shell;
}
public abstract void install();
}
/**
*
* @ClassName: HuaweiPhone
* @Description: 抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法
* @author: ljx
* @date: 2019年1月18日 下午3:21:38
*/
public class HuaweiPhone extends Phone{
public HuaweiPhone(Shell shell) {
super(shell);
}
@Override
public void install() {
System.out.println("我是华为手机,现在挑选手机壳的颜色为:");
shell.color();
}
}
/**
*
* @ClassName: ApplePhone
* @Description: 抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法
* @author: ljx
* @date: 2019年1月18日 下午3:21:34
*/
public class ApplePhone extends Phone{
public ApplePhone(Shell shell) {
super(shell);
}
@Override
public void install() {
System.out.println("我是苹果手机,现在挑选手机壳的颜色为:");
shell.color();
}
}
/**
*
* @ClassName: Test
* @Description: 测试
* @author: ljx
* @date: 2019年1月18日 下午3:22:25
*/
public class Test {
public static void main(String[] args) {
//手机
Phone iPhone = new ApplePhone(new YellowShello());
Phone hwPhone = new HuaweiPhone(new RedShell());
iPhone.install();
hwPhone.install();
}
}
结果:
我是苹果手机,现在挑选手机壳的颜色为:
红色手机壳
我是华为手机,现在挑选手机壳的颜色为:
黄色手机壳
我们所熟悉的JDBC连接的原理就是使用桥接模式实现的。
![](https://img-blog.csdnimg.cn/20190118155743114.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxNTk0OTEzODAx,size_16,color_FFFFFF,t_70)
......,欢迎指正!