Bridge
将抽象部分(业务功能)与它的实现部分分离(平台分离),使它们可以独立地变化。
① 创建软件与平台的接口SoftWareImpl(其实现类(iOS或者Android)会实现与软件连接的接口)
/**
* 软件与平台的接口
*/
public interface SoftWareImpl {
// 连接接口
public void connect();
// 声音接口
public void voice();
}
② 创建Abstractin(这里指软件SoftWare,应为软件有精简版Lite和旗舰版Ultimate) 所以用抽象类
/**
* 软件,有Android和iOS平台
*/
public abstract class SoftWare {
// 多态指针指向impl,运行时根据传入的平台调用
protected SoftWareImpl softWareImpl;
// 构造方法,让子类动态传入平台对象
public SoftWare(SoftWareImpl softWareImpl){
this.softWareImpl = softWareImpl;
}
// 软件的功能,抽象方法
public abstract void boom();
}
③ 创建iOS和Android平台实现类
// IOS平台连接配置
public class IOSSoftWareImpl implements SoftWareImpl {
@Override
public void connect() {
System.out.println("连接上IOS系统");
}
@Override
public void voice() {
System.out.println("成功进行声音配置");
}
}
// 安卓平台连接配置
public class AndroidSoftWareImpl implements SoftWareImpl {
@Override
public void connect() {
System.out.println("连接上安卓系统");
}
@Override
public void voice() {
System.out.println("成功进行声音配置");
}
}
④ 创建精简版和旗舰版具体类
/**
* 精简版软件
* 因为改软件本身有精简版和旗舰版,都需要用到软件的基本功能
* 所以将SoftWareImpl提取到父类,父类通过构造函数传给子类
*/
public class Lite extends SoftWare {
public Lite(SoftWareImpl softWareImpl) {
super(softWareImpl);
}
@Override
public void boom() {
// 连接到指定平台,声音配置
softWareImpl.connect();
softWareImpl.voice();
System.out.println("10秒后爆炸");
}
}
// 旗舰版
public class Ultimate extends SoftWare {
public Ultimate(SoftWareImpl softWareImpl) {
super(softWareImpl);
}
@Override
public void boom() {
softWareImpl.connect();
softWareImpl.voice();
System.out.println("直接爆炸");
}
}
⑤ 测试
public static void main(String[] args) {
// 运行时装配
// 创建安卓连接对象
SoftWareImpl softWareImpl = new AndroidSoftWareImpl();
// 创建软件精简版对象,把安卓放进去
SoftWare softWare = new Lite(softWareImpl);
softWare.boom();
}
结果:
连接上安卓系统
成功进行声音配置
10秒后爆炸
场景:一般用在 " 两个非常强的变化维度,如例子中的软件版本和连接平台 ",多于两个变化维度,可用bridge扩展模式
优点:Bridge模式解耦了抽象和实现之间固有的绑定关系,使抽象和实现可沿着各自的维度来变化,即子类化他们
有时候类似于多继承方案,但是多继承往往违背单一职责原则(即一个类中只有一个变化的原因),复用性差