我们的主人公大维德是江苏泰兴中部一个小县城的一个暴发户的儿子,他不学无术,仗着家里开了一个厂,有着3个宅基地,好吃懒做,吃喝嫖赌,不过这个儿子可让他爸爸操碎了心,他爸爸为了将来大维德能接管这个工厂,让大维德每天监视工人干活,看看有没有偷懒的,但是从小养尊处优的大维德竟然就连盯着工人干活都觉得累,干活的工人没觉得累,他一个看别人干活的,说累,呜呼哀哉!!!
废话不多说,大维德家开厂的,开厂就要涉及到收钱,
一天大维徳爸爸说:儿子,现在这个支付宝,微信支付啥的很成熟,现在大家都不带现金了,我们厂里也支持一下网络支付,你设计一下。
大维德一听表示:老爸,这个我是专业的,你看我好歹北大青鸟培训了6个月,事情交给我,你放心。
说干就干,大维德未了表示他并不是一无是处,于是开始写代码
public boolean doPay(BigDecimal amount, String channelType, int payType){
if("微信支付".equals(channelType)) {
System.out.println("模拟微信渠道支付开始:------");
if (1 == payType ) {
System.out.println("刷脸支付:" + amount + "元");
}else if(2 == payType) {
System.out.println("密码支付:" + amount + "元");
}
} else if("支付宝支付".equals(channelType)){
System.out.println("模拟支付宝渠道支付开始:------");
if (1 == payType ) {
System.out.println("刷脸支付:" + amount + "元");
} else if(2 == payType) {
System.out.println("密码支付:" + amount + "元");
}
}
return true;
}
写完,大维德还骄傲的交给他爸爸:爸爸,你看写好了,儿子我厉不厉害。大维德沾沾自喜,感觉他爸爸肯定会夸奖他能干。
但是事与愿违,他爸爸一看儿子,写成这样,直接拍案而起,捶胸顿足,扬天长叹:"我怎么生出你这么个孽子(逆子)啊!,你这个废物,你这么写,如果以后支付渠道增加了云闪付,支付方式增加了网页支付,指纹支付,你怎么搞”
俗话说将是老的辣,大维德爸爸亲自设计了接口:
/**
大维德爸爸花子虚将支付进行了拆分
** 设计一个支付类型的接口
**/
interface IPayType{
boolean pay(BigDecimal amount);
}
/**
* 密码支付
*/
class PasswordPay implements IPayType{
@Override
public boolean pay(BigDecimal amount) {
System.out.println("密码支付付款: " + amount + "元");
return true;
}
}
/**
* 刷脸支付
*/
class FacePay implements IPayType{
@Override
public boolean pay(BigDecimal amount) {
System.out.println("刷脸支付付款: " + amount + "元");
return false;
}
}
然后设计一个支付渠道的抽象类
/**
* ⽀付类型桥接抽象类
* 这个类中定义了⽀付⽅式的需要实现的划账接⼝: pay ,
* 以及桥接接⼝; payType ,并在构造函数中⽤户⽅⾃⾏选择⽀付⽅式
*/
abstract class Pay {
// 包含一个对实现化对象的引用
protected IPayType payType;
public Pay(IPayType payType) {
this.payType = payType;
}
public abstract Boolean pay(BigDecimal amount);
}
/**
* 扩展实现抽象化角色
*/
class WechatPay extends Pay{
public WechatPay(IPayType payType) {
super(payType);
}
@Override
public Boolean pay(BigDecimal amount) {
System.out.println("模拟微信渠道支付开始:------");
payType.pay(amount);
return null;
}
}
class AliPay extends Pay{
public AliPay(IPayType payType) {
super(payType);
}
@Override
public Boolean pay(BigDecimal amount) {
System.out.println("模拟支付宝渠道支付开始:------");
payType.pay(amount);
return true;
}
}
然后就可以自由组合支付渠道跟支付方式,以后增加了云闪付也也可自由选择支付方式(刷脸or密码支付)
public static void main(String[] args) {
System.out.println("模拟测试场景;微信⽀付、⼈脸⽅式。");
Pay wechatPay = new WechatPay(new FacePay());
wechatPay.pay(new BigDecimal("100"));
System.out.println("\r\n模拟测试场景;⽀付宝⽀付、密码⽅式。");
Pay aliPay = new AliPay(new PasswordPay());
aliPay.pay(new BigDecimal(180));
}
总结:
桥接模式。意如其名。就是将一个类中两个维度进行分离开来。将抽象接口与实现解耦。
然后通过组合桥接关联在一起。组合使用。其两个对象都是抽象,
然后其子类具体实践。由抽象接口对实现化角色的对象的引用来关联。桥接模式适合用于两个维度常变化的类。把多角度分离出来,然后让他们独立变化,减少耦合。
通过桥接模式可以使它们在抽象层建立一个关联关系。
用继承会造成较为复杂的程序后果、扩展起来不那么灵活