设计模式系列5---多变灵活的桥接

《桥接》 — SanjayF
小时候,梦想是当一名宇航员,驾驭飞船,太空探索。
长大后,梦想是当一名渔船夫,划着扁舟,荡漾湖面。
后来啊,梦想是当一名大土豪,开着汽车,周游列国。
而现在,梦想是当一名好码农,敲着代码,写完桥接。
enter image description here
图: 周庄的桥

好啦,改编自余光中乡愁的一篇打油诗《桥接》写好了。
不知道你有没感受到桥接的梦想,反正我是被桥接击中了。

嗯,好,写到现在第五篇,文章的格式出来了,
开头一个故事,接着是编码讲解,再来是定义,然后是后记。

那么我们进入精彩编码讲解

实现

我们来看下怎么用代码来表示这篇打油诗
我们先抽象出梦想。

public abstract class Dream {

    public abstract void beSomeThing();

    public abstract void doSomeThing();
}

我们的梦想很简单的样子,就是成为某东西,然后做点什么。

public class PilotDream extends Dream {

    @Override
    public void beSomeThing() {
        System.out.print("成为宇航员");
    }

    @Override
    public void doSomeThing() {
        System.out.print("开飞船,探索太空");
    }
}


public class RichDream extends Dream {

    @Override
    public void beSomeThing() {
        System.out.print("成为土豪");
    }

    @Override
    public void doSomeThing() {
        System.out.print("开车,周游列国");
    }
}


public class FishermanDream extends Dream {

    @Override
    public void beSomeThing() {
        System.out.print("成为渔夫");
    }

    @Override
    public void doSomeThing() {
        System.out.print("划扁舟,荡漾湖面");
    }
}

为了说明方便,这里就写三个梦想,不罗列太多。

接着我们来看下抽象出来的我—人类

public abstract class HumanBeing {

    private Dream dream;

    public HumanBeing(Dream dream) {
        this.dream = dream;
    }

    public void ExecuteDream() {
        dream.beSomeThing();
        dream.doSomeThing();
    }
}

作为一个地球人,我们可以有梦想,然后去追寻,实现我们的梦想的能力。

现在我们来看下小时候想成宇航员的我

public class ChildMe extends HumanBeing {

    public ChildMe(PilotDream dream) {
        super(dream);
    }

    public void ExecuteDream() {
        super.ExecuteDream();
        System.out.println("我在执行宇航员梦");
    }
}

接着看下长大后想成渔翁的我

public class GroupUpMe extends HumanBeing {

    public GroupUpMe(Fisherman dream) {
        super(dream);
    }

    public void ExecuteDream() {
        super.ExecuteDream();
        System.out.println("我在执行渔翁梦");
    }
}

接着是后来想当土豪的我

public class OlderMe extends HumanBeing {

    public OlderMe(RichDream dream) {
        super(dream);
    }

    public void ExecuteDream() {
        super.ExecuteDream();
        System.out.println("我在执行做土豪梦");
    }
}

好了,我们准备好了,现在只缺我们的命运终端了.
亮出我们的命运终端

public class LifeTerminal {

    public static void main(String[] args) {

        PilotDream pilotDream = new PilotDream();
        ChildMe childMe = new ChildMe(pilotDream);
        childMe.ExecuteDream();

        GroupUpMe groupUpMe = new GroupUpMe(new FishermanDream());
        groupUpMe.ExecuteDream();

        OlderMe olderMe = new OlderMe(new RichDream());
        olderMe.ExecuteDream();

    }
}

很好,这个就是我们的打油诗《桥接》的实现啦。
我们的命运终端安排着小时候的我,长大后的我和后来的我等人生轨迹。

如果再再再后来的我有了新的梦想,那么只需要再扩展下梦想,扩展下我的人类阶段就可以啦。
我们的命运终端再次调用就可以了。

看完能感觉到桥接的魅力吗?难道你想说好像只是一堆抽象的事情而已嘛。
似乎也是啊啊啊啊。

他的最重要的魅力估计就是下面这样几行代表出来的。

public class LifeTerminal {

    public static void main(String[] args) {

        Me me = new Me(new FishermanDream());
        me.ExecuteDream();

    }
}

public class Me extends HumanBeing {

    public Me(Dream dream) {
        super(dream);
    }

    public void ExecuteDream() {
        super.ExecuteDream();
        System.out.println("我在追寻梦想");
    }
}

我,就是我,可以去实现任何梦想,没有时间,地点,空间的限制。

我的梦想可以自由扩展,而人类也可以自由扩展,唯一需要做的就是在命运终端加多这件事。
一次OCP开闭原则的很好表现不是吗?

定义

我们来看下我们桥接

enter image description here

他就是因为中间一个impl的横线出名的,一桥结缘,连接两者。
左边一个业务抽象角色,右边一个业务实现角色。
命运终端在冥冥中执行了所有。

热评文章