一、模式介绍
1.1、定义
将抽象与实现分离,使它们可以独立变化。另一种定义:一个类存在两个(或多个)独立变化的维度,我们通过组合的方式,让这两个(或多个)维度可以独立进行扩展。
通过组合关系来替代继承关系,避免继承层次的指数级爆炸,从而降低了抽象和实现这两个可变维度的耦合度。
1.2、优点
- 抽象与实现分离,扩展能力强
- 符合开闭原则
- 符合合成复用原则
- 其实现细节对客户透明
1.3、缺点
由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,能正确地识别出系统中两个独立变化的维度,这增加了系统的理解与设计难度。
二、结构与实现
2.1、结构
- 抽象化角色(Abstraction):定义抽象类,并包含一个对实现化的引用
- 扩展抽象化角色(RefinedAbstraction):是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法
- 实现化角色(Implementor):定义实现化角色的接口,供扩展抽象化角色调用
- 具体实现化角色(ConcreteImplementor):给出实现化角色接口的具体实现
2.2、实现
2.2.1、Abstraction
package com.erlang.bridge;
/**
* @description: 抽象化角色
* @author: erlang
* @since: 2022-02-14 21:13
*/
public abstract class Abstraction {
/**
* 实现化角色
*/
protected Implementor impl;
protected Abstraction(Implementor impl) {
this.impl = impl;
}
/**
* 抽象化角色 方法
*/
public abstract void operation();
}
2.2.2、RefinedAbstraction
package com.erlang.bridge;
/**
* @description: 扩展抽象化角色
* @author: erlang
* @since: 2022-02-14 21:13
*/
public class RefinedAbstraction extends Abstraction {
public RefinedAbstraction(Implementor imple) {
super(imple);
}
@Override
public void operation() {
System.out.println("扩展抽象化角色 RefinedAbstraction 方法");
impl.method();
}
}
2.2.3、Implementor
package com.erlang.bridge;
/**
* @description: 实现化角色
* @author: erlang
* @since: 2022-02-14 21:11
*/
public interface Implementor {
/**
* 业务方法
*/
void method();
}
2.2.4、ConcreteImplementor
package com.erlang.bridge;
/**
* @description: 具体实现化角色
* @author: erlang
* @since: 2022-02-14 21:11
*/
public class ConcreteImplementor implements Implementor {
@Override
public void method() {
System.out.println("具体实现化角色 ConcreteImplementor 方法");
}
}
2.2.5、BridgeClient
package com.erlang.bridge;
/**
* @description: 桥接模式客户端
* @author: erlang
* @since: 2022-02-14 21:11
*/
public class BridgeClient {
public static void main(String[] args) {
Implementor imple = new ConcreteImplementor();
Abstraction abs = new RefinedAbstraction(imple);
abs.operation();
}
}
2.2.6、 执行结果
扩展抽象化角色 RefinedAbstraction 方法
具体实现化角色 ConcreteImplementor 方法