桥接模式(Bridge Pattern):将抽象部分与实现部分分离,使得它们可以独立变化。
Tips:需要注意的是,桥接模式中的抽象并不是指抽象类或接口这种硬性概念,实现也不是具体指实现类;抽象与实现分离指的是两种维度的分离。这需要我们继续学习后面的知识;
桥接模式主要的目的就是用组合/聚合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
【案例】
我们需要创建不同品牌的不同设备,这种关系使用继承来描述如下:
设计好继承体系后,我们发现类的数量非常非常多,如果需要新增一个品牌或者新增一个设备都会导致类的数量激增;因为一个品牌都有手机、电脑、相机等设备。一个设备也会有小米、华为、神舟等品牌;这样一来不利于后期的维护。
所谓抽象与实现的分离指的是:不直接编写小米手机类、小米电脑类去继承小米这个品牌。而是将系统分为两个纬度(品牌、设备)一个为抽象纬度(品牌),一个为实现纬度(设备)进行抽象化;这样抽象与实现就进行分离了。
桥接模式中,主要包含4个角色:
桥接模式将系统体系划分为了多个纬度来看待;多个纬度采用组合的方式来进行代码的解耦;
我们将产品作为实现纬度,品牌作为抽象纬度来设计系统的体系;
package com.dfbz.demo01;
/**
* @author lscl
* @version 1.0
* @intro: 抽象角色
*/
public abstract class Product {
// 使用组合关系关联产品的品牌(包含具体实现角色的引用)
protected Brand brand;
public Product(Brand brand) {
this.brand = brand;
}
public abstract String getProduct();
public void show() {
System.out.println("您正在使用【" + brand.getBrand() + "】牌【" + getProduct() + "】");
}
}
package com.dfbz.demo01;
/**
* @author lscl
* @version 1.0
* @intro: 具体抽象角色
*/
public class PhoneProduct extends Product {
public PhoneProduct(Brand brand) {
super(brand);
}
@Override
public String getProduct() {
return "手机";
}
}
package com.dfbz.demo01;
/**
* @author lscl
* @version 1.0
* @intro: 具体实现角色
*/
public class ComputerProduct extends Product {
public ComputerProduct(Brand brand) {
super(brand);
}
@Override
public String getProduct() {
return "电脑";
}
}
package com.dfbz.demo01;
/**
* @author lscl
* @version 1.0
* @intro: 实现角色
*/
public interface Brand {
String getBrand();
}
package com.dfbz.demo01;
/**
* @author lscl
* @version 1.0
* @intro: 具体实现角色
*/
public class XiaoMiBrand implements Brand {
@Override
public String getBrand() {
return "小米";
}
}
package com.dfbz.demo01;
/**
* @author lscl
* @version 1.0
* @intro: 具体实现角色
*/
public class HuaWeiBrand implements Brand {
@Override
public String getBrand() {
return "华为";
}
}
package com.dfbz.demo01;
/**
* @author lscl
* @version 1.0
* @intro:
*/
public class Demo01 {
public static void main(String[] args) {
Brand brand = new XiaoMiBrand();
Product product = new ComputerProduct(brand);
product.show(); // 小米牌电脑
System.out.println("------------------");
brand = new HuaWeiBrand();
product = new PhoneProduct(brand);
product.show(); // 华为牌手机
System.out.println("------------------");
product = new ComputerProduct(brand);
product.show(); // 华为牌电脑
System.out.println("------------------");
}
}
运行效果如下:
优点:
缺点: