案例:
现在有一个手机接口,下面有三个抽象子类,分别是锁屏密码解锁的手机、指纹解锁的手机、人脸识别解锁的手机,每个抽象子类下又有多个品牌的手机,每个首相子类下面下面有三个子类,小米、华为、魅族。这时如果再出现一种瞳孔识别的手机,又得新增一个抽象类,抽象类下面三个子类。这是传统的解决方式,类太多 ,不好维护
如果使用桥接模式,需要有一个品牌接口,下面三个子类小米、华为或者更多个品牌去实现这个品牌接口。还需要一个手机抽象类,下面有多个解锁类型的实现子类,其中聚合了品牌接口。
代码实现:
品牌接口
public interface Brand {
void open();
void close();
void call();
}
品牌实现类
public class XiaoMi implements Brand {
@Override
public void open() {
System.out.println("小米手机开机");
}
@Override
public void close() {
System.out.println("小米手机关机");
}
@Override
public void call() {
System.out.println("小米手机打电话");
}
}
public class HUAWEI implements Brand{
@Override
public void open() {
System.out.println("华为手机开机");
}
@Override
public void close() {
System.out.println("华为手机关机");
}
@Override
public void call() {
System.out.println("华为手机打电话");
}
}
手机抽象类
public abstract class Phone {
//聚合一个品牌
private Brand brand;
public Phone(Brand brand){
this.brand = brand;
}
protected void open(){
brand.open();
}
protected void close(){
brand.close();
}
protected void call(){
brand.call();
}
}
解锁类型子类
//锁屏密码解锁手机
public class PasswordLockScreenPhone extends Phone {
public PasswordLockScreenPhone(Brand brand) {
super(brand);
}
public void open(){
super.open();
System.out.println("锁屏密码手机");
}
public void close(){
super.close();
System.out.println("锁屏密码手机");
}
public void call(){
super.call();
System.out.println("锁屏密码手机");
}
}
//指纹解锁手机
public class FingerScanPhone extends Phone {
public FingerScanPhone(Brand brand) {
super(brand);
}
public void open(){
super.open();
System.out.println("指纹解锁手机");
}
public void close(){
super.close();
System.out.println("指纹解锁手机");
}
public void call(){
super.call();
System.out.println("指纹解锁手机");
}
}
测试调用
public class Client {
public static void main(String[] args) {
//小米锁屏密码手机
Phone phone = new PasswordLockScreenPhone(new XiaoMi());
phone.open();
phone.close();
phone.call();
System.out.println("____________");
//华为指纹解锁手机
phone = new FingerScanPhone(new HUAWEI());
phone.open();
phone.close();
phone.call();
}
}
输出结果
这样一来,如果想新增一个手机品牌,只需要新增一个类去实现品牌接口就可以
如果想新增一个解锁类型的手机,只需要新增一个类去继承解锁类型抽象类即可
在jdbc中的DriverManager注册驱动时用到了桥接模式