有这样一个需求:不同手机有不同款式同时也有不同品牌,要编程实现手机的功能(开机、关机、打电话等)
普通的思路是创建一个phone方法,让款式类去继承Phone方法,然后再让品牌类去继承款式类
这种方法存在的问题是:
1、扩展性不好,增加一个手机的样式,就得增加所有品牌的类,或者增加一个品牌就得在所有样式下增加这个品牌的类。
2、违反了单一指责原则,增加一个样式就得增加所有品牌。
我们需要桥接模式去解决这些问题。
桥接模式
桥接模式是指将实现和抽象放在两个不同的类层次中,使两个层次可以独立改变。简单来说就是将两种不同的继承体系通过聚合/组合联系在一起。桥接模式是一种结构型的设计模式。
上面的案例我们可以创建品牌的接口,让品牌子类去实现;创建手机的抽象类,让样式子类去继承,最后将品牌抽象类聚合进手机抽象类中。
类图
品牌类及实现
public interface Brand {
void call();
}
public class Xiaomi implements Brand {
@Override
public void call() {
System.out.println("小米手机打电话");
}
}
public class VIVO implements Brand {
@Override
public void call() {
System.out.println("Vivo手机打电话");
}
}
手机样式类及其实现
public abstract class Phone {
private Brand brand;
public Phone(Brand brand) {
this.brand = brand;
}
public void call(){
brand.call();
}
}
public class FoldedPhone extends Phone {
public FoldedPhone(Brand brand) {
super(brand);
}
public void call(){
super.call();
System.out.println("折叠样式的手机");
}
}
public class UprightPhone extends Phone{
public UprightPhone(Brand brand) {
super(brand);
}
public void call(){
super.call();
System.out.println("立式样式的手机");
}
}
客户端使用:
public class Client {
public static void main(String[] args) {
FoldedPhone phone=new FoldedPhone(new Xiaomi());
phone.call();
}
}
桥接模式的优点:
1)分离抽象和实现部分
桥接模式分离了抽象部分和实现部分,从而极大地提供了系统的灵活性。让抽象部分和实现部分独立出来,分别定义接口,这有助于对系统进行分层,从而产生更好的结构化的系统。
2)更好的扩展性
桥梁模式使得抽象部分和实现部分可以分别独立地扩展,而不会相互影响,从而大大提高了系统的可扩展性。