桥接模式官方给出的概念:将实体与抽象分离,使它们可以独立变化。对应到代码可以理解为将对象实体和属性分离,两者独立变化,避免使用多继承。
举个例子:笔包含多种类型:铅笔、圆珠笔、钢笔等等,每种类型又对应不同的颜色,红色、蓝色、黑色。。
如果使用多继承实现,最顶层定义笔抽象类,下一层继承实现铅笔、圆珠笔、钢笔,再下一层继承实现红色铅笔、蓝色铅笔等等。。。这种处理方式需要创建大量的类,并且一旦增加或者删除某个属性,都需要创建或者删除大量的类
为了解决该问题,我们可以把:类型、颜色抽象出来,使两者独立变化,避免使用多继承,这种设计模式就叫桥接模式,桥接模式通常包含以下模块:
- 抽象化:被抽象出的属性
- 拓展抽象化:抽象属性具体实现值
- 实现化:抽象类,需包含拓展抽象化才完整
- 具体实现化:具体实体类
拿上面的例子来说,笔的类型和颜色都可以作为属性抽象化,拓展抽象化就是指钢笔、铅笔、红色、蓝色这些抽象属性的具体实现,实现化就是指还没有设置类型和颜色的笔,只有设计了笔和颜色,才是完整的对象,也就是具体实现化
下面我们看具体示例:
interface Implementor {
void operationImpl();
}
class ImplementorA implements Implementor {
@Override
public void operationImpl() {
System.out.println("ImplementorA被访问");
}
}
class ImplementorB implements Implementor {
@Override
public void operationImpl() {
System.out.println("ImplementorB被访问");
}
}
abstract class Abstraction {
protected Implementor implementor;
protected Abstraction(Implementor implementor) {
this.implementor = implementor;
}
public abstract void operation();
}
class RefinedAbstraction extends Abstraction {
protected RefinedAbstraction(Implementor implementor) {
super(implementor);
}
@Override
public void operation() {
implementor.operationImpl();
}
}
实际上桥接模式在平时开发中经常被用到,比如当某个对象属性值包含多种枚举值时,都再采用桥接模式。使用时需要注意对象采用引用传递,修改一个引用的值,所有引用值都会修改,这里建议使用枚举,否则修改可能影响其它对象属性值