案例:
现在有一个手机接口,下面有三个抽象子类,分别是锁屏密码解锁的手机、指纹解锁的手机、人脸识别解锁的手机,每个抽象子类下又有多个品牌的手机,每个首相子类下面下面有三个子类,小米、华为、魅族。这时如果再出现一种瞳孔识别的手机,又得新增一个抽象类,抽象类下面三个子类。这是传统的解决方式,类太多 ,不好维护
如果使用桥接模式,需要有一个品牌接口,下面三个子类小米、华为或者更多个品牌去实现这个品牌接口。还需要一个手机抽象类,下面有多个解锁类型的实现子类,其中聚合了品牌接口。
代码实现:
品牌接口
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注册驱动时用到了桥接模式