本周的学习计划包括这篇设计模式了。离上次更文也隔了半个多月了,发现设计模式的学习之路自己是一件挺枯燥的事情,可是若是能用一种有趣的方式将出来,我以为是很厉害的,所以,我在学习的同时也但愿可以以更通俗的语言来说解这些东西。编程
今天要学的讲的内容是结构型模式的第四种----桥接模式。设计模式
桥接模式的问题经常用来解决多个维度的问题。好比这张经典的图,河一边是电脑、电视、收音机等设备,而河对岸是各类遥控器,这其实对应两个维度,经过一架高桥完成链接通讯。而所谓的“桥”的联系是提取出来的接口的联系,在维度一中调用维度二的接口,而后把接口传入维度一的构造方法中。markdown
下面咱们继续以浅谈装饰者模式中的手抓饼案例为例,来开始桥接模式的讲解。架构
假设卖手抓饼的大娘 目前的业务有山东杂粮煎饼、原味手抓饼。如今为了扩大销量,采用了 线下店铺和淘宝电商的多种渠道方式,这就是包括售卖产品和售卖渠道的两种维度。post
可是这种定义明显有着一个缺点,就是每增长一种售卖产品,可能相应的就多了好多种售卖渠道的产品,一样的每多一种售卖渠道,就多好多种售卖产品的渠道。不管增长哪一维度,都须要建立更多的类,所以,在一个多种可能会变化的维度的系统中,用继承会形成类爆炸,不灵活,每次在一个维度上新增一个具体实现,都须要增长多个子类,此时就能够考虑桥接模式。学习
桥接模式(Bridge patten),是结构型设计模式的一种,它能够将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构,从而能够在开发时分别使用。this
引用百度百科定义:spa
将抽象部分与它的实现部分分离,使它们均可以独立的变化。设计
百度百科的定义相对难懂,咱们只须要记住桥接模式的特色将抽象和实现分离,在抽象层创建依赖,从而两个维度上的实现类能够进行各自的变化而不会相互影响,具备很是好的扩展性。3d
桥接模式包含如下角色:
下面,咱们开始对前面将的案例进行 demo 还原。
实现化角色:
/**
* 售卖方式
* @Author xiaolei
* @Date 2021/7/17 16:02
**/
public interface SaleModel {
void sale(String product);
}
复制代码
线下店铺售卖 --- 具体实现化角色:
public class OfflineSafe implements SaleModel {
public void sale(String product) {
System.out.println("线下店铺售卖:"+product);
}
}
复制代码
线上淘宝售卖 --- 具体实现化角色
public class TaoBaoSafe implements SaleModel {
public void sale(String product) {
System.out.println("淘宝电商售卖:"+product);
}
}
复制代码
产品类:
/**
* 售卖产品
**/
public abstract class Product {
protected SaleModel saleModel;
public Product(SaleModel saleModel){
this.saleModel=saleModel;
}
public abstract void make(String name);
}
复制代码
手抓饼 -- (抽象化角色子类)
public class HandPancke extends Product {
public HandPancke(SaleModel saleModel) {
super(saleModel);
}
public void make(String name) {
saleModel.sale(name);
}
}
复制代码
山东杂粮煎饼类 --(抽象化角色子类)
public class ShandongPancake extends Product {
public ShandongPancake(SaleModel saleModel) {
super(saleModel);
}
public void make(String name) {
saleModel.sale(name);
}
}
复制代码
输出结果:
桥接模式的一个经常使用使用场景就是为了替换 继承,继承自己具有强侵入性(父类代码侵入子类),形成子类臃肿,所以,优先使用组合/聚合的方式。
桥接模式的特色是将抽象与实现分离,所以它适合
这个维度的概念,咱们在抽象工厂中也提到过,这二者都与多个维度相关。可是抽象工厂模式更关注的是对象的建立,是建立型模式,而桥接模式则是更关注的是对象建立以后的动做或功能,因此区别是在这块。
在画uml 的时候,发现这二者十分的类似,它们都可以避免类爆炸,把继承变组合,下降了耦合。可是装饰者模式它是封闭的类,须要用同一个接口装饰,接口在父类中定义,而桥接模式不用使用同一个接口。
桥接模式一般会于开发前期进行设计,使你可以将程序的各个部分独立开来以便开发。它的特色将抽象和实现分离,在抽象层创建依赖,从而两个维度上的实现类能够进行各自的变化而不会相互影响,具备很是好的扩展性。
设计模式自己在应用中是有必定难度的,须要必定的业务经验积累,若是哪一天你在哪一个底层源码中忽然领略到哪一个你看过的模式,就值了,若是哪一天,你在面对业务捉急的时候,忽然把脑门一拍,哎,要不试试装饰者模式,那你可能就顿悟了,但愿那一天离你更近一点。我是潇雷,若是你以为本文对你有帮助或启发,帮忙点个赞,这将是我创做的最好动力!