一、什么是桥接模式模式
桥梁模式的用意是“将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化”
应用场景
- 系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性
- 不想使用继承导致系统类的个数急剧增加的系统
- 有时候一个类,可能会拥有多个变化维度,比如啤酒,有不同的容量和品牌,可以使用继承组合的方式进行开发,假如维度很多,就容易出现类的膨胀,使用桥接模式就可以解决这个问题,且解耦
二、桥接模式的实现方式
模式结构分析:
桥接模式所涉及的角色有:
● 抽象化(Abstraction)角色:抽象化给出的定义,并保存一个对实现化对象的引用。
● 修正抽象化(RefinedAbstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义。
● 实现化(Implementor)角色:这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。
● 具体实现化(ConcreteImplementor)角色:这个角色给出实现化角色接口的具体实现。
案例中类关系图:
统一模型:
代码实现:
查看代码
public abstract class Phone {
/**
* 通过组合的⽅式来桥接其他⾏为
*/
protected Color color;
public void setColor(Color color) {
this.color = color;
}
/**
* ⼿机的⽅法
*/
abstract public void run();
}
//颜色维度
public interface Color {
void userColor();
}
/*
* 具体的手机(iphone)
* */
public class IPhone extends Phone {
public IPhone(Color color){
super.setColor(color);
}
@Override
public void run() {
color.userColor();
System.out.println("苹果⼿机");
}
}
/*
*具体的手机(huawei)
* */
public class HWPhone extends Phone {
public HWPhone(Color color){
super.setColor(color);
}
@Override
public void run() {
color.userColor();
System.out.println("华为⼿机");
}
}/*
* 具体的颜色(红色)
* */
public class RedColor implements Color{
@Override
public void userColor() {
System.out.println("红色");
}
}
/*
* 具体的颜色(黄色)
* */
public class YellowColor implements Color {
@Override
public void userColor() {
System.out.println("黄色");
}
}
/*
* 具体的颜色(蓝色)
* */
public class BlueColor implements Color {
@Override
public void userColor() {
System.out.println("蓝⾊");
}
}
测试用例:
/*
* 桥接模式
* */
@Test
public void brigeDesign(){
HWPhone blueHwPhone = new HWPhone(new BlueColor());
blueHwPhone.run();
HWPhone redHwPhone = new HWPhone(new RedColor());
redHwPhone.run();
IPhone applePhone = new IPhone(new RedColor());
applePhone.run();
}
测试结果:
蓝⾊
华为⼿机
红色
华为⼿机
红色
苹果⼿机
方法评估:
按GOF的说法,桥接模式和适配器模式用于设计的不同阶段
- 桥接模式用于设计的前期,精细化的设计,让系统更加灵活。
- 适配器模式用于设计完成之后,发现类、接口之间无法一起工作,需要进行填坑。
适配器模式经常用在第三方API协同工作的场合,在功能集成需求越来越多的今天,这种模式的使用频度越来越高,包括有些同学听过外观设计模式,这个也是某些场景和适配器模式一样
优点:
- 抽象和实现的分离。
- 优秀的扩展能力,符合开闭原则缺点。
缺点:
- 增加系统的理解与设计难度。
- 使用聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程,比如抽象类汽车,里面聚合了颜色类,有点像对象适配器。