zoukankan      html  css  js  c++  java
  • 桥接

    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接口了。但对于桥接模式而言,它巧妙运用了抽象类(抽象画笔类)植入接口(尺子接口),这样我们不但能替换各种形状的尺子实现类,还能替换各种颜色的画笔子类,这就是对抽象、实现的双边解耦、分离、脱钩。

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

  • 相关阅读:
    网络安全分析
    java实现 洛谷 P1464 Function
    java实现 洛谷 P1464 Function
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1540 机器
    java实现 洛谷 P1540 机器
  • 原文地址:https://www.cnblogs.com/guoyu1/p/13974634.html
Copyright © 2011-2022 走看看