• 桥接


    https://mp.weixin.qq.com/s/_9zDX0ljV4mr2NwiUd83kg

    要致富先修路,一说到路啊桥啊我们就想到它的重要性,它可以把本是相对孤立的经济体连接起来,使得双边贸易往来更加便利,经济合作更加高效。桥接,用桥梁连接,英文叫Bridge,其实就是桥梁之意。

    现在假设我们要作一幅抽象画,用各种形状的色块来表达世界文化的多样性,起名《形形色色》。

    需要什么工具来作画呢?一堆彩笔和一堆尺子。嗯,据我所知,这两种工具分别产于两个孤岛,北岛有很多颜料,擅长制造画笔,南岛则擅长生产尺子,各种形状的尺子,这是劳动分工的最佳典范,下来我们就要去促进南北文具经济合作了,先来看看南岛生产的尺子产品。

    这些尺子不管是什么形状,其实都是对绘画线条提供一种规范,那我们就先定义一个尺子的接口,用于规则化笔触的走向。

    1public interface Ruler {// 尺子
    2    // 规则化笔触走向
    3    public void regularize();
    4}

    对于具体的尺子类,我们暂且忽略其大小,一种形状就对应一个类,分别是方形、三角形、还有圆形,它们统统实现尺子的规则接口。

    1public class SquareRuler implements Ruler {
    2
    3  @Override
    4  public void regularize() {//尺子模板画出正方形
    5    System.out.println("□");
    6  }
    7
    8}
    1public class TriangleRuler implements Ruler {
    2
    3  @Override
    4  public void regularize() {//尺子模板画出三角形
    5    System.out.println("△");
    6  }
    7
    8}
    1public class CircleRuler implements Ruler {
    2
    3  @Override
    4  public void regularize() {//尺子模板画出圆形
    5    System.out.println("○");
    6  }
    7
    8}

    南岛经济很简单,下来看北岛产品,他们生产的是五颜六色的彩色画笔。

    我们对画笔进行抽象,此处我们用抽象类。

     1public abstract class Pen {//画笔
    2
    3  protected Ruler ruler;//尺子的引用
    4
    5  public Pen(Ruler ruler) {
    6    this.ruler = ruler;
    7  }
    8
    9  public abstract void draw();//抽象方法
    10}

    注意这里的抽象画笔(第3行)引用了尺子接口,并且声明为protected,得以让彩笔子类进行继承,并由第5行构造子注入尺子,此处便是桥梁对接的重点。最后就是第9行的draw方法了,这个需要具体的彩笔子类进行实现。

    接下来看彩笔类,我们依旧保持简约,只实现黑色和白色两种画笔。

     1public class BlackPen extends Pen {
    2
    3  public BlackPen(Ruler ruler) {
    4    super(ruler);
    5  }
    6
    7  @Override
    8  public void draw() {
    9      System.out.print("黑");
    10      ruler.regularize();
    11  }
    12
    13}
     1public class WhitePen extends Pen {
    2
    3  public WhitePen(Ruler ruler) {
    4    super(ruler);
    5  }
    6
    7  @Override
    8  public void draw() {
    9      System.out.print("白");
    10      ruler.regularize();
    11  }
    12
    13}

    我们在第4行的构造子中调用了抽象画笔的构造子注入传入的尺子,建立桥梁的连接,在第9行选用自己的颜色进行绘画并于第10行调用尺子进行笔触规范。一切就绪,我们开始绘制史诗巨著。

     1public class Client {
    2
    3    public static void main(String args[]) {
    4
    5        //白色画笔对应的所有形状
    6        new WhitePen(new CircleRuler()).draw();
    7        new WhitePen(new SquareRuler()).draw();
    8        new WhitePen(new TriangleRuler()).draw();
    9
    10        //黑色画笔对应的所有形状
    11        new BlackPen(new CircleRuler()).draw();
    12        new BlackPen(new SquareRuler()).draw();
    13        new BlackPen(new TriangleRuler()).draw();
    14
    15        /*运行结果:
    16            白○
    17            白□
    18            白△
    19            黑○
    20            黑□
    21            黑△
    22        */
    23    }
    24
    25}

    注意看我们是怎样进行实例化的,初始化彩笔确定其颜色并注入并确定其形状,紧接着画出来的就是相应的形色组合了。简单吧?接下来就交给南北岛的工人们去做各种形状的尺子和颜色的画笔了,画家会利用这些工具随意组合创作出自己想要的画作。

    注意,上图只画出了红色和形状的组合,其他颜色亦是如此,其中7种颜色以及5种形状的组合就达到了35种,而此处我们只需要7+5个类便可以实现。试想如果有更多的颜色和形状,且没有这种松散分离的结构要多少个类来实现?那将会是一场噩梦。有没有发现这就是笛卡儿积的组合,来看我们的代码中的两个集合:

     

        颜色集合={黑,白}

        形状集合={圆形,方形,三角}

        那么这两个集合的笛卡尔积为

        {

            (黑,圆形), (黑,方形), (黑,三角),

            (白,圆形), (白,方形), (白,三角)

        }

    我们发现这个结构是不是有点像策略模式?其实策略更强调的是行为的替换,就像是之前例子中我们可以随意替换USB接口上接入的各种设备而改变输入输出行为,那对于宿主(电脑主机)本身是耦合了USB接口的,我们无法进行替换,只能重新写个全新的宿主并重新焊接USB接口了。但对于桥接模式而言,它巧妙运用了抽象类(抽象画笔类)植入接口(尺子接口),这样我们不但能替换各种形状的尺子实现类,还能替换各种颜色的画笔子类,这就是对抽象、实现的双边解耦、分离、脱钩。

    劳动分工实现了工种的无限的扩展,经济合作则促进了双边组合的无限可能,桥梁作为经济合作发展的纽带不可或缺,一带一路的大战略,扩展靠经济带,连接靠路桥。

  • 相关阅读:
    指定一个M3U8文件,判断它包含的TS文件是不是都存在。指定一个Office生成的Swf文件,判断它包含的Swf文件是不是完整都存在。
    东师理想云平台异步任务处理系统V2.0重构思路
    Mysql查询出所有列名
    IntelliJ IDEA添加jar包
    IDEA下利用Jrebel插件实现JFinal项目main方法【热加载】
    整理OpenResty+Mysql+Tomcat+JFinal+Cannal+HUI
    有没有 linux 命令可以获取我的公网 ip, 类似 ip138.com 上获取的 ip?
    MongoDB学习笔记(5)--document
    MongoDB学习笔记(4)--collection
    MongoDB学习笔记(3)--删除数据库
  • 原文地址:https://www.cnblogs.com/guoyu1/p/13974634.html
Copyright © 2020-2023  润新知