桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化。桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化,像我们常用的JDBC桥DriverManager一样,JDBC进行连接数据库的时候,在各个数据库之间进行切换,基本不需要动太多的代码,甚至丝毫不用动
作者是个二吊子,如果描述有误请指出.
使用场景
我们在电商平台中,有三种会员,黑铁会员, 黄铜会员,白金会员.三种会员购买商品的价格会有不同的折扣,以及积分也有差异,无论何种身份都可以使用优惠券,两者可以叠加
会员种类 | 购买折扣 | 积分 |
---|---|---|
黑铁会员 | 0.98 | 实付金额*90% |
黄铜会员 | 0.95 | 实付金额* 88% |
白金会员 | 0.90 | 实付金额*85% |
我们传统的做法是创建一个会员类,然后有等级,根据不同等级进行判断购买折扣和积分情况.其实也没有什么问题,功能是可以实现的.但是如果考虑扩展性.我加一个骨灰会员,那么我就要动原本的代码了.违反了开闭原则吧,本来之前的功能还算稳定,我一手操作可能就GG.这里也有单一职责的意思在里面.我们做到类单一.进行有效切分.这个时候我们就估摸着用设计模式看看,bingo, 桥接模式.
桥接模式
uml图
抽象vip的行为(Vip),具有打折和积分行为.提供黑铁vip(BlackIronVip)和黄铜vip(BrassVip)两种具体实现
定义VipBridge桥接类,进行桥接vip的行为.桥接的使用缘由: 全部vip与非vip均可以使用优惠券,如果我们为每个会员再定义优惠券,那么如果我们新增一个优惠券就必须改动原有的黑铁vip和黄铜vip,这违反了开闭.所以我们用桥接进行转接他们的行为,实现独立变化的过程
Coupon100 为 100元优惠券,其中可能包含金额判断,超过500元才可以使用该优惠券,这部分没有在代码体现.只是个简单demo
关系: 黑铁vip与黄铜vip实现vip接口,桥接类为抽象类聚合或者组合vip,其内部已经实现了折扣和积分的行为,通过组合或者聚合调用vip的行为.Coupon100 为使用优惠券行为.
/**
* @Description: vip接口
* @Author: gaofan
* @Date: 2020/3/23 10:24
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public interface Vip {
// 会员打折
public void discount();
// 会员积分
public void points();
}
/**
* @Description: 黑铁会员
* @Author: gaofan
* @Date: 2020/3/23 10:24
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public class BlackIronVip implements Vip{
@Override
public void discount() {
System.out.println("黑铁会员98折哦!");
}
@Override
public void points() {
System.out.println("黑铁会员积分 实付金额* 90%");
}
}
/**
* @Description: 黄铜会员
* @Author: gaofan
* @Date: 2020/3/23 10:31
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public class BrassVip implements Vip {
@Override
public void discount() {
System.out.println("黄铜会员95折哦!");
}
@Override
public void points() {
System.out.println("黑铁会员积分 实付金额* 88%");
}
}
/**
* @Description: 桥接类,这里桥接不同会员行为和优惠券行为
* @Author: gaofan
* @Date: 2020/3/23 10:33
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public abstract class VipBridge {
private Vip vip;
public VipBridge(Vip vip) {
this.vip = vip;
}
public void discount(){
vip.discount();
}
public void points(){
vip.points();
}
}
/**
* @Description: 优惠券
* @Author: gaofan
* @Date: 2020/3/23 10:36
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public class Coupon100 extends VipBridge {
public Coupon100(Vip vip) {
super(vip);
}
// 金额计算
public void discount() {
System.out.println("原价减去100优惠券后进行价格折算");
super.discount();
}
// 积分计算
public void points() {
System.out.println("原价减去100优惠券后进行积分计算");
super.points();
}
}
/**
* @Description: TODO
* @Author: gaofan
* @Date: 2020/3/23 10:47
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public class Client {
public static void main(String [] args){
VipBridge vipBridge = new Coupon100(new BlackIronVip());
vipBridge.discount();
vipBridge.points();
}
}
类型: 桥接模式
原理: 通过桥接类组合或者聚合其行为抽象类.然后定义其行为方法,通过调用持有的组合或者聚合的对象行为.然后继承桥接类进行行为的桥接.
优点: 让行为可以独立变化,我们新增会员或者新增优惠券只需要增加相应代码而不需要去改动之前的逻辑代码,避免骚操作.这也是解耦思想.开闭原则的体现.
本文借鉴尚硅谷Java设计模式,韩顺平图解java,传送门