概念:将抽象和实现解耦,使得两者都可以独立变化
一个例子:以手机为例,手机有翻盖式的,有推拉式的还有直板式的,而手机的品牌又多种多样,如果我们将每一种手机样式和品牌组合,那么就需要创建非常多的类很容易发生类爆炸问题,比如小米翻盖手机、小米推拉式手机、小米直板式手机……华为翻盖手机、华为推拉式手机等等等等,如果我们为每一种都创建一个类,这样做就会造成我们的项目中需要维护的对象大量冗余,维护成本也随之提高,而且实际上这些种类往往是无比繁多的。
简单理解:桥接将继承转为关联,降低类之间的耦合度,减少代码量(多个分类之间组合)
直接上代码:
(1)创建一个品牌接口,用于展示logo
public interface Brand {
public void showLogo();
}
(2)创建一些品牌,实现上述接口
public class MiBrand implements Brand{
@Override
public void showLogo() {
System.out.println("【Brand Mi】小米:为发烧而生");
}
}
public class HuaweiBrand implements Brand{
@Override
public void showLogo() {
System.out.println("【Brand HUEWEI】华为:你的Mate,自带光环。");
}
}
(3)创建一个手机抽象类,手机应该有自己的开关机logo画面,所以要跟刚刚创建的品牌做关联,使用聚合的方式。手机得有自己的开关机功能吧,所以声明两个抽象方法。
public abstract class Phone {
protected Brand brand;
public Phone(Brand brand) {
this.brand = brand;
}
// 开机
public abstract void open();
// 关机
public abstract void close();
}
(4)创建一个折叠手机类,继承手机抽象类,具体开关机要怎样的logo就在方法的实现做逻辑处理。
// 折叠手机
public class FoldedPhone extends Phone{
public FoldedPhone(Brand brand) {
super(brand);
}
@Override
public void open() {
brand.showLogo(); // 开机时展示logo
System.out.println("折叠手机-开机");
}
@Override
public void close() {
brand.showLogo(); // 关机时展示logo
System.out.println("折叠手机-关机");
}
}
(5)创建客户端测试
public class Client {
public static void main(String[] args) {
Brand huawei = new HuaweiBrand();
Phone phone = new FoldedPhone(huawei);
phone.open();
phone.close();
System.out.println("=============");
}
}
折叠手机-开机
【Brand HUEWEI】华为:你的Mate,自带光环。
折叠手机-关机
=============
此时分析一下,如果还有一种类型的手机(曲面屏手机)呢,应怎么处理?此时应加一个类即可,继承Phone
(6)创建曲面屏手机类,继承phone
public class QMPhone extends Phone{
public QMPhone(Brand brand) {
super(brand);
}
@Override
public void open() {
brand.showLogo(); // 开机时展示logo
System.out.println("曲面手机-开机");
}
@Override
public void close() {
brand.showLogo(); // 关机时展示logo
System.out.println("曲面手机-关机");
}
}
(7)添加客户端代码测试
package com.ctsi.bridge;
public class Client {
public static void main(String[] args) {
Brand huawei = new HuaweiBrand();
Phone phone = new FoldedPhone(huawei);
phone.open();
phone.close();
System.out.println("=============");
// 曲面手机
Brand xiaomi = new MiBrand();
Phone phone1 = new QMPhone(xiaomi);
phone1.open();
phone1.close();
}
}
【Brand HUEWEI】华为:你的Mate,自带光环。
折叠手机-开机
【Brand HUEWEI】华为:你的Mate,自带光环。
折叠手机-关机
=============
【Brand Mi】小米:为发烧而生
曲面手机-开机
【Brand Mi】小米:为发烧而生
曲面手机-关机