桥接模式 Bridge

桥接模式

将抽象部分与实现部分分离,使它们都可以独立的变化。

这个目的定义不是很好懂,我举个例子,假设我们有很多手机产商,如图所示,他们都是做手机的,对于某一个产商来说,同一个产商可以产很多不同功能的手机
在这里插入图片描述

  • 拆分,站在手机的角度,手机定义以下四点功能,那么我们可以简单的认为,如果你要成为一个手机产商,那么你就得支持以下功能
  1. 系统
  2. cpu
  3. 屏幕
  4. 支持4G
    这里的支持功能,也就是所有手机都含有的功能,我们将这些公共的功能称为抽象部分,也就是这里的手机定义的接口。也就是对应手机定义的接口
    在这里插入图片描述
  • 站在产商的角度,我们那oppo手机举例,oppo手机除了支持手机基本的功能外,它还可以对手机进行创新,它可以支持自己特有的功能,如图所示
  1. oppo手机支持升降摄像头
    这里的特有的功能,也就是oppo手机的特有功能,我们将这些特有的功能称为实现部分,也就是这里的OPPO定义的接口。也就是对应OPPO定义的接口
    在这里插入图片描述

分析上述设计的缺点

基于上面的设计图,我们添加手机支持5G,那么产商小米、华为、OPPO也会从手机类继承到5G

  1. 对于新手机来说,新增5G手机功能比较简单,直接实现就好了
  2. 但是对于现有手机,如小米2s,自身就是不支持5G的,但是它的父类,小米产商从手机继承了5G,导致设计上冲突了
    在这里插入图片描述

也就说,这里无法解决公共功能和特有功能的解耦,也就是我们一开始的那么话,桥接模式的目的是将:将抽象部分与实现部分分离,使它们都可以独立的变化。
翻译一下,就是公共功能的变化,和特有功能的变化,互不影响

引入桥接模式

将继承改为依赖,手机公共部分如果要添加新的功能,也不会再影响产商了,产商可以根据自己的手机实现,绑定不同的公共部分的版本
在这里插入图片描述
通过代码演进一下

  • 实现公共部分

定义手机

public interface Phone {
	void system();
	void cpu();
	void screen();
	void support4G();
}

实现手机定义

public class PhoneVersion1Bridge implements Phone {

	@Override
	public void system() {
		System.out.println("系统Android 6.0");
	}

	@Override
	public void cpu() {
		System.out.println("高通666");
	}

	@Override
	public void screen() {
		System.out.println("三星屏幕");
	}

	@Override
	public void support4G() {
		System.out.println("支持4G");
	}
	
}
  • 实现特有部分

小米手机定义

public abstract class XiaoMi {
	// 系统启动
	public abstract void run();
	
	public abstract void miui();
}

小米手机实现

public class XiaoMi2S extends XiaoMi {

private Phone phone;
	
	public XiaoMi2S(Phone phone) {
		this.phone = phone;
	}

	@Override
	public void run() {
		phone.system();
		phone.screen();
		miui();
		phone.cpu();
		phone.support4G();
	}

	@Override
	public void miui() {
		System.out.println("自定义UI 6.0");
	}

}

测试

public class BridgeDemo {
	public static void main(String[] args) {
		XiaoMi xiaomi = new XiaoMi2S(new PhoneVersion1Bridge());
		xiaomi.run();
	}
}

测试结构

系统Android 6.0
三星屏幕
自定义UI 6.0
高通666
支持4G

特有部分这里不需要演进,因为不会影响公共部分,比如小米增加新功能,不会对公共部分造成影响,所有我们这里演进一下公共部分

现在手机支持5G

有两种修改,在原有的功能接口修改,或者继承接口

第一种,原有的功能接口修改实现

修改原有的抽象

public interface Phone {
	void system();
	void cpu();
	void screen();
	void support4G();
	void support5G();
}

实现新的抽象,和修改原有的实现

修改原有的实现

public class PhoneVersion1Bridge implements Phone {

	@Override
	public void system() {
		System.out.println("系统Android 6.0");
	}

	@Override
	public void cpu() {
		System.out.println("高通666");
	}

	@Override
	public void screen() {
		System.out.println("三星屏幕");
	}

	@Override
	public void support4G() {
		System.out.println("支持4G");
	}

	@Override
	public void support5G() {
		throw new UnsupportedOperationException();
	}
	
}

实现新的抽象

public class PhoneVersion2Bridge implements Phone {

	@Override
	public void system() {
		System.out.println("系统Android 8.0");
	}

	@Override
	public void cpu() {
		System.out.println("高通888");
	}

	@Override
	public void screen() {
		System.out.println("三星屏幕");
	}

	@Override
	public void support4G() {
		System.out.println("支持4G");
	}
	
	@Override
	public void support5G() {
		System.out.println("支持5G");
	}

}

新增小米10,支持5G

public class XiaoMi10 extends XiaoMi {

	private Phone phone;
	
	public XiaoMi10(Phone phone) {
		this.phone = phone;
	}

	@Override
	public void run() {
		phone.system();
		phone.screen();
		miui();
		phone.cpu();
		phone.support4G();
		phone.support5G();
	}

	@Override
	public void miui() {
		System.out.println("自定义UI 10.0");
	}

}

测试类

public class BridgeDemo {
	public static void main(String[] args) {
		XiaoMi xiaomi = new XiaoMi2S(new PhoneVersion1Bridge());
		xiaomi.run();
		System.out.println();
		XiaoMi xiaomi10 = new XiaoMi10(new PhoneVersion2Bridge());
		xiaomi10.run();
		System.out.println();
		// 给2s装一个高版本的
		xiaomi = new XiaoMi2S(new PhoneVersion2Bridge());
		xiaomi.run();
	}
}

测试结果

系统Android 6.0
三星屏幕
自定义UI 6.0
高通666
支持4G

系统Android 8.0
三星屏幕
自定义UI 10.0
高通888
支持4G
支持5G

系统Android 8.0
三星屏幕
自定义UI 6.0
高通888
支持4G

完美兼容,将抽象部分与实现部分分离,使它们都可以独立的变化。

第二种,继承接口修改实现

定义新的抽象

public interface Phone2 extends Phone {
	void support5G();
}

实现新的抽象

public class PhoneVersion2Bridge implements Phone2 {

	@Override
	public void system() {
		System.out.println("系统Android 8.0");
	}

	@Override
	public void cpu() {
		System.out.println("高通888");
	}

	@Override
	public void screen() {
		System.out.println("三星屏幕");
	}

	@Override
	public void support4G() {
		System.out.println("支持4G");
	}
	
	@Override
	public void support5G() {
		System.out.println("支持5G");
	}

}

新增小米10,支持5G

public class XiaoMi10 extends XiaoMi {

	private Phone2 phone;
	
	public XiaoMi10(Phone2 phone) {
		this.phone = phone;
	}

	@Override
	public void run() {
		phone.system();
		phone.screen();
		miui();
		phone.cpu();
		phone.support4G();
		phone.support5G();
	}

	@Override
	public void miui() {
		System.out.println("自定义UI 10.0");
	}

}

测试类

public class BridgeDemo {
	public static void main(String[] args) {
		XiaoMi xiaomi = new XiaoMi2S(new PhoneVersion1Bridge());
		xiaomi.run();
		System.out.println();
		XiaoMi xiaomi10 = new XiaoMi10(new PhoneVersion2Bridge());
		xiaomi10.run();
		System.out.println();
		// 给2s装一个高版本的
		xiaomi = new XiaoMi2S(new PhoneVersion2Bridge());
		xiaomi.run();
	}
}

测试结果

系统Android 6.0
三星屏幕
自定义UI 6.0
高通666
支持4G

系统Android 8.0
三星屏幕
自定义UI 10.0
高通888
支持4G
支持5G

系统Android 8.0
三星屏幕
自定义UI 6.0
高通888
支持4G

完美兼容,将抽象部分与实现部分分离,使它们都可以独立的变化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值