【浅谈设计模式】(9):桥接模式--由“手抓饼案例”再次入门

前言

本周的学习计划包括这篇设计模式了。离上次更文也隔了半个多月了,发现设计模式的学习之路自己是一件挺枯燥的事情,可是若是能用一种有趣的方式将出来,我以为是很厉害的,所以,我在学习的同时也但愿可以以更通俗的语言来说解这些东西。编程

今天要学的讲的内容是结构型模式的第四种----桥接模式。设计模式

1、桥接模式入门

1.1 概述

桥接模式的问题经常用来解决多个维度的问题。好比这张经典的图,河一边是电脑、电视、收音机等设备,而河对岸是各类遥控器,这其实对应两个维度,经过一架高桥完成链接通讯。而所谓的“桥”的联系是提取出来的接口的联系,在维度一中调用维度二的接口,而后把接口传入维度一的构造方法中。markdown

桥接设计模式

下面咱们继续以浅谈装饰者模式中的手抓饼案例为例,来开始桥接模式的讲解。架构

假设卖手抓饼的大娘 目前的业务有山东杂粮煎饼、原味手抓饼。如今为了扩大销量,采用了 线下店铺和淘宝电商的多种渠道方式,这就是包括售卖产品和售卖渠道的两种维度。post

image-20210717145048709

可是这种定义明显有着一个缺点,就是每增长一种售卖产品,可能相应的就多了好多种售卖渠道的产品,一样的每多一种售卖渠道,就多好多种售卖产品的渠道。不管增长哪一维度,都须要建立更多的类,所以,在一个多种可能会变化的维度的系统中,用继承会形成类爆炸,不灵活,每次在一个维度上新增一个具体实现,都须要增长多个子类,此时就能够考虑桥接模式学习

桥接模式(Bridge patten),是结构型设计模式的一种,它能够将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构,从而能够在开发时分别使用。this

引用百度百科定义:spa

将抽象部分与它的实现部分分离,使它们均可以独立的变化。设计

百度百科的定义相对难懂,咱们只须要记住桥接模式的特色将抽象和实现分离,在抽象层创建依赖,从而两个维度上的实现类能够进行各自的变化而不会相互影响,具备很是好的扩展性。3d

1.2 桥接模式结构

桥接模式包含如下角色:

  • 抽象化角色:定义抽象类,并包含一个对实现化对象的引用。
  • 扩展抽象化角色:是抽象化角色的子类,实现父类中的业务方法,并经过组合关系调用实现化角色中的业务方法。
  • 实现化角色:定义实现化角色的接口,供扩展抽象化角色调用
  • 具体实现化角色:给出实现化角色接口的具体实现。

2、案例讲解

下面,咱们开始对前面将的案例进行 demo 还原。

image-20210717162807253

实现化角色:

/**
 * 售卖方式
 * @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);
    }
}
复制代码

输出结果:

image-20210717163043470

3、 总结

3.1 优缺点

3.1.1 优势
  • 抽象和实现分离:这是桥接模式的主要特色,也是避免使用继承的主要缘由。使用桥接模式,解耦了抽象和实现,使得二者的变化不会对另外一方产生影响,使得系统扩展性大大加强。
  • 优秀的扩展能力:桥接模式的出现是为了解决多个独立变化的维度的耦合,其高层模块聚合关系已肯定,所以,不管是抽象变化 仍是实现 变化,只要对其进行扩展便可,高层代码无序更改,严格遵照了依赖倒置原则。
  • 实现细节对客户透明:因为桥接模式在高层模块中经过聚合关系构建了稳定的架构(封装)。所以,客户只需与高层模块交互,对抽象和实现的细节彻底不需关注。
3.1.2 缺点
  • 桥接模式 因为聚合关联关系创建在抽象层,要求开发者对抽象层进行设计与编程,增长系统的理解和设计难度。

3.2 使用场景

桥接模式的一个经常使用使用场景就是为了替换 继承,继承自己具有强侵入性(父类代码侵入子类),形成子类臃肿,所以,优先使用组合/聚合的方式。

桥接模式的特色是将抽象与实现分离,所以它适合

  • 一个类存在两个或多个独立变化的维度,并且这两个维度都须要扩展
  • 不但愿或不适用继承的场景

3.3 模式对比

  • 桥接模式和抽象工厂模式区别:

这个维度的概念,咱们在抽象工厂中也提到过,这二者都与多个维度相关。可是抽象工厂模式更关注的是对象的建立,是建立型模式,而桥接模式则是更关注的是对象建立以后的动做或功能,因此区别是在这块。

  • 桥接模式和装饰者模式区别:

在画uml 的时候,发现这二者十分的类似,它们都可以避免类爆炸,把继承变组合,下降了耦合。可是装饰者模式它是封闭的类,须要用同一个接口装饰,接口在父类中定义,而桥接模式不用使用同一个接口。

3.4 小结😄

桥接模式一般会于开发前期进行设计,使你可以将程序的各个部分独立开来以便开发。它的特色将抽象和实现分离,在抽象层创建依赖,从而两个维度上的实现类能够进行各自的变化而不会相互影响,具备很是好的扩展性。

设计模式自己在应用中是有必定难度的,须要必定的业务经验积累,若是哪一天你在哪一个底层源码中忽然领略到哪一个你看过的模式,就值了,若是哪一天,你在面对业务捉急的时候,忽然把脑门一拍,哎,要不试试装饰者模式,那你可能就顿悟了,但愿那一天离你更近一点。我是潇雷,若是你以为本文对你有帮助或启发,帮忙点个赞,这将是我创做的最好动力!

4、浅谈设计模式系列👏👏👏

相关文章
相关标签/搜索