桥接模式就是将抽象部分与它的实现部分分离,使它们都可以独立地变化。桥接模式在我们的日常生活中还是很普遍存在的。尤其是在商场里面,我们常见的商品分类就是最好的桥接模式。
适用于
1.你不希望在抽象和它的实现部分之间有一个固定的绑定关系。
例如这种情况可能是在程序运行时刻实现部分应该可以被选择或者切换。
2.类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。
这时Bridge模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。
3.对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。
桥接模式的核心要点就是处理多层集成结构,处理多维度变化的场景,将各个维度设计成独立的继承结构,是各个维度可以独立的扩展在抽象层建立关联。其实也就是将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以独立的变化。
当我们增加手机品牌的时候,变化的是品牌的维度而类型维度不会发生变化。
手机类
public class Phone {
public Brand brand;
public Phone(Brand brand) {
this.brand = brand;
}
public String sale(){
return brand.sale();
}
}
class CameraPhone extends Phone{
public CameraPhone(Brand brand) {
super(brand);
}
}
class MusicPhone extends Phone{
public MusicPhone(Brand brand) {
super(brand);
}
}
class BusinessPhone extends Phone{
public BusinessPhone(Brand brand) {
super(brand);
}
}
品牌类
public interface Brand {
String sale();
}
class Huawei implements Brand{
@Override
public String sale() {
return "正在销售华为手机";
}
}
class Lenovo implements Brand{
@Override
public String sale() {
return "正在销售联想手机";
}
}
class Honor implements Brand{
@Override
public String sale() {
return "正在销售荣耀手机";
}
}
测试代码
Phone phone = new MusicPhone(new Huawei());
System.out.println(phone.sale());
如果此时你还想增加一款手机,你可以在品牌类里面增加这款手机的品牌类尝试一下,看看是否还需要修改手机类Phone里面的代码就能出现上面的效果。到这里桥接模式已经结束了。