本文转载自微信公众号《狼王编程》,作者狼王。转载本文请联系狼王编程公众号。一、概述桥接模式是一种结构设计模式,可以将一个大的类或一系列密切相关的类拆分成两个独立的层次结构进行抽象和实现,以便在开发时可以单独使用。2、适用场景1)如果要拆分或重组一个具有多种功能的复杂类,可以使用桥接模式。2)如果您希望在几个独立的维度上扩展一个类,请使用此模式。对象的属性由其他类实现,你不需要自己处理所有的工作。3)如果需要在运行时切换不同的实现方式,可以使用桥接模式。桥接模式可以替代抽象部分的实现对象,具体操作只需简单的为成员变量赋新值即可。3、示例有以下场景:支付方式:微信、支付宝支付方式:指纹、刷脸3.1不要使用桥接方式定义两个枚举/***paymentmethod*/publicenumPayMethodEnum{FACE(0,"Scanface"),FINGER(1,"Fingerprint");PayMethodEnum(intcode,Stringname){this.code=code;this.name=name;}publicintgetCode(){returncode;}publicvoidsetCode(intcode){this.code=code;}publicStringgetName(intcode){PayMethodEnum[]payWaysEnums=values();for(PayMethodEnumpayMethodEnum:payWaysEnums){if(payMethodEnum.code==code){returnpayMethodEnum.name;}}returnnull;}publicvoidsetName(Stringname){this.name=name;}privateintcode;privateStringname;}/***支付方式*/publicenumPayWaysEnum{智付宝(0,"支付宝"),WEIXIN(1,"微信");PayWaysEnum(intcode,Stringname){this.code=code;this.name=name;}publicintgetCode(){returncode;}publicvoidsetCode(intcode){this.code=code;}privateintcode;publicvoidsetName(Stringname){this.name=name;}publicStringgetName(intcode){PayWaysEnum[]payWaysEnums=values();对于(PayWaysEnumpayWaysEnum:payWaysEnums){if(payWaysEnum.code==code){returnpayWaysEnum.name;}}returnnull;}privateStringname;}定义支付业务流程:publicclassPay{publicvoidpay(intpayMethod,intpayWay){if(PayMethodEnum.FACE.getCode()==payMethod){System.out.println("当前支付methodis:"+PayMethodEnum.FACE.getName(payMethod));}else{System.out.println("当前支付方式为:"+PayMethodEnum.FINGER.getName(payMethod));}if(PayWaysEnum.ZHIFUBAO.getCode()==payWay){System.out.println("当前支付方式为:"+PayWaysEnum.ZHIFUBAO.getName(payWay));}else{System.out.println("当前支付方式为:"+PayWaysEnum.WEIXIN.getName(payWay));}}}测试类:@RunWith(SpringRunner.class)@SpringBootTest(classes=TestApplication.class)publicclassTestDemo{@Testpublicvoidtest(){Paypay=newPay();//支付宝扫描刷脸支付pay.pay(PayMethodEnum.FACE.getCode(),PayWaysEnum.ZHIFUBAO.getCode());System.out.println("-------------------------------------");//微信刷脸支付pay.pay(PayMethodEnum.FACE.getCode(),PayWaysEnum.WEIXIN.getCode());System.out.println("----------------------------------------");//支付宝指纹支付pay.pay(PayMethodEnum.FINGER.getCode(),PayWaysEnum.ZHIFUBAO.getCode());System.out.println("---------------------------------");//微信指纹支付pay.pay(PayMethodEnum.FINGER.getCode(),PayWaysEnum.WEIXIN.getCode());System.out.println("-----------------------------------");}}结果:当前支付方式是:扫描face当前支付方式为:支付宝------------------------------------当前支付方式方式为:刷脸当前支付方式为:微信----------------------------------------当前支付方式为:指纹支付当前支付方式为:支付宝----------------------------------------当前支付方式为:指纹当前支付方式为:微信------------------------------------------3.2使用桥接模式定义枚举:/***paymentmethod*/publicenumPayMethodEnum{FACE(0,"FaceScan"),FINGER(1,"Fingerprint");PayMethodEnum(intcode,Stringname){this.code=code;this.name=name;}publicintgetCode(){returncode;}publicvoidsetCode(intcode){this.code=code;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}privateintcode;privateStringname;}/***支付方式*/publicenumPayWaysEnum{ZHIFUBAO(0,"支付宝"),WEIXIN(1,"微信"));PayWaysEnum(intcode,Stringname){this.code=code;this.name=name;}publicintgetCode(){returncode;}publicvoidsetCode(intcode){this.code=code;}privateintcode;publicvoidsetName(Stringname){this.name=name;}publicStringgetName(){returnname;}privateStringname;}定义两个顶层抽象接口:/***支付方式接口*/publicinterfaceIPayMethod{voidpay();}/***支付方式接口*/publicinterfaceIPayWay{voidpay();}定义两种支付方式:/***Fingerprint*/publicclassFingerPayimplementsIPayMethod{@Overridepublicvoidpay(){System.out.println("当前支付方式为:"+PayMethodEnum.FINGER.name());}}/***刷脸*/publicclassFacePayimplementsIPayMethod{@Overridepublicvoidpay(){System.out.println("当前支付方式为:"+PayMethodEnum.FACE.name());}}定义两种支付方式:/***微信*/publicclassWXPayWayimplementsIPayWay{privateIPayMethodpayMethod;publicWXPayWay(IPayMethodpayMethod){this.payMethod=payMethod;}@Overridepublicvoidpay(){System.out.println("当前支付方式为:"+PayWaysEnum.WEIXIN.getName());payMethod.pay();}}/***支付宝*/publicclassZFBPayWayimplementsIPayWay{privateIPayMethod支付方法;publicZFBPayWay(IPayMethodpayMethod){this.payMethod=payMethod;}@Overridepublicvoidpay(){System.out.println("当前支付方式为:"+PayWaysEnum.ZHIFUBAO.getName());payMethod.pay();}}测试class:@RunWith(SpringRunner.class)@SpringBootTest(classes=TestApplication.class)publicclassTestDemo{@Testpublicvoidtest(){FacePayfacePay=newFacePay();FingerPayfingerPay=newFingerPay();ZFBPayWayzfbPayFace=newZFBPayWay(facePay);WXPayWaywxPayWayWay(newWXPayWaywxPayWayWayFa);ZFBPayWayzfbPayFinger=newZFBPayWay(fingerPay);WXPayWaywxPayWayFinger=newWXPayWay(fingerPay);//支付宝刷脸支付zfbPayFace.pay();System.out.println("-------------------------------------");//微信刷脸支付wxPayWayFace.pay();System.out.println("--------------------------------------");//支付宝指纹支付zfbPayFinger.pay();System.out.println("------------------------------------");//微信指纹支付wxPayWayFinger.pay();System.out.println("-------------------------------------");}}结果:当之前的支付方式是:支付宝现在的支付方式是:FACE--------------------------------------当前支付方式为:微信当前支付方式为:FACE-----------------------------------当前支付方式为:支付宝当前支付方式为:FINGER------------------------------------当前支付方式为:微信当前支付方式为:FINGER-------------------------------------4.分析以上两种方式实现了四种支付流程,其中支付方式(支付宝、微信)是主要方式,包括两种支付方式(刷脸、指纹)的分析代码量:不使用:codeor比较少,但实际上主要业务逻辑需要从Pay类中卸载出来,通过if和else判断判断业务逻辑。使用:代码量大大增加,增加了很多类,但是pay的业务逻辑只会在自己的类中执行,符合单一职责。从可扩展性的角度,如果增加了闪付支付方式:未使用:需要修改Pay类增加对闪付的逻辑判断,不符合开闭原则。使用:只需要增加一个云闪付支付方式,不需要修改其他业务逻辑,符合开闭原则。代码耦合级别:未使用:代码业务逻辑耦合在一起。使用:非常低的代码耦合。5、总结优点:1)客户端只与高层抽象交互,不关心内部对象。2)符合单一原则。3)遵守开闭原则。缺点:在很多业务对象和很多可以抽象的业务逻辑方面,类的数量会大大增加,导致代码复杂。
