概述
基本介绍
1、桥接模式(Bridge Pattern)是指:将现实和抽象放在两个不同的类层次中,使这两个层次可以独立改变;
2、桥接模式是一种结构型设计模式
3、Bridge 设计模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责,它的主要特点是把抽象与行为实现分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展
桥接模式原理类图
说明:
1、Client类:桥接模式的调用者;
2、抽象类(Abstraction) :维护了Implementor /即它的实现类ConcreteImplementorA…,二者是聚合关系, Abstraction充当桥接类;
3、RedefinedAbstraction:是Abstraction抽象类的子类;
4、Implementor:行为实现类的接口;
5、ConcreteImplementorA/B:行为的具体实现类。
从UML类图中可以看出,这里的抽象类和接口是聚合的关系,也就是调用和被调用的关系。
桥接模式优缺点
优点:
1、抽象和实现的分离
2、优秀的扩展能力
3、实现细节对客户透明
缺点:
1、增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程
2、要求正确识别出系统中两个独立变化的纬度,因此其使用范围有一定的局限性
案例
家电电器有很多种,也有很多品牌,电器和品牌存在关系
如图所示,如果按照这样的设计,每增加一种电器就需要对应的绑定品牌;另一种情况是,每增加一个品牌就需要在对应的电器下添加。这样的话会导致出现许多重复性的代码,而且耦合度也很高。
如果添加新的品牌或者新的电器而不会改动先有的类,该怎么设计呢?
根据桥接模式,代码可以设计成下图的流程
ElectricAppliance接口:
/**
* 家用电器接口
*/
public interface ElectricAppliance {
String description();
}
AirConditioner类、WashingMachine类、WaterHeater类:
/**
* 空调
*/
public class AirConditioner implements ElectricAppliance{
private final String name = "空调";
@Override
public String description() {
return name;
}
}
/**
* 洗衣机
*/
public class WashingMachine implements ElectricAppliance {
private final String name = "洗衣机";
@Override
public String description() {
return name;
}
}
/**
* 热水器
*/
public class WaterHeater implements ElectricAppliance{
private final String name = "热水器";
@Override
public String description() {
return name;
}
}
Brand抽象类:
/**
* 抽象类:品牌类
*/
public abstract class Brand {
protected ElectricAppliance electricAppliance;
public Brand(ElectricAppliance electricAppliance) {
this.electricAppliance = electricAppliance;
}
abstract String description();
}
Gree类、Haier类、Midea类:
/**
* 格力
*/
public class Gree extends Brand{
private final String name = "格力";
public Gree(ElectricAppliance electricAppliance){
super(electricAppliance);
}
@Override
String description() {
return name +"品牌的"+ electricAppliance.description();
}
}
/**
* 海尔
*/
public class Haier extends Brand{
private final String name = "海尔";
public Haier(ElectricAppliance electricAppliance) {
super(electricAppliance);
}
@Override
String description() {
return name + "品牌的"+electricAppliance.description();
}
}
public class Midea extends Brand{
private final String name = "美的";
public Midea(ElectricAppliance electricAppliance) {
super(electricAppliance);
}
@Override
String description() {
return name + electricAppliance.description();
}
}
Test:测试类
public class BridgeTest {
public static void main(String[] args) {
Brand midea = new Midea(new WashingMachine());
System.out.println(midea.description());
Brand gree1 = new Gree(new WashingMachine());
System.out.println(gree1.description());
// 添加新电器
Brand gree2 = new Gree(new AirConditioner());
System.out.println(gree2.description());
// 添加新品牌
Brand haier1 = new Haier(new WashingMachine());
System.out.println(haier1.description());
Brand haier2 = new Haier(new WaterHeater());
System.out.println(haier2.description());
}
}
运行结果
美的洗衣机
格力品牌的洗衣机
格力品牌的空调
海尔品牌的洗衣机
海尔品牌的热水器