浅谈Bridge桥接模式

1、前言编程

写到这里,基本上就是前面几种模式的扩展和区别了,能够看到咱们前面的几种模式,不少时候都出现了重叠,这里要分清一个概念,模式并非彻底隔离和独立的,有的模式内部其实用到了其它模式的技术,可是又有本身的创新点,若是一味地认为每一个模式都是独一无二的,与其它模式彻底区别的,这是一种误区,所以,这里又看到了基础知识的重要性。从不一样的角度都有各自的共同性,好比从人的角度,每一个人都是不一样的,可如果从原子分子的角度,每一个人又是相同的,那究竟是相同仍是不通,取决于咱们看问题的角度。所以,咱们要学会求同辨异!桥接模式是一种将类的功能层次和实现层次分离的技术,所谓类的功能层次指的是类要实现什么功能,要定义多少个函数进行处理,在功能之中咱们会用到继承来定义新的方法同时也能使用父类的方法,这就构成了一个层次“父类-子类-孙类...”,这就是功能层次,与之对应的就是实现层次了,其实很好理解,若是咱们事先肯定了完成一件事情的最基本的子功能,那么咱们定义这些子功能为接口或者抽象类,而后使用实现类来进行实现,这样一个抽象类,多个实现类,这样的结构就是实现层次,能够看到高度一直为2,而功能层次高度为N(N为继承的层次)。那么可不能够将二者分离呢,一方面咱们知道一个类的基础子功能而且可以使用到这些子功能的实现,另外一方面咱们能够在这些子功能的基础上定义出咱们本身须要的功能(功能层次),若是能够的话,基本的元素就至关于空气、水分等元素,而咱们须要的功能就是将这些东西组成一种种不一样的物质。这里就用到了委托,或者说是组合。实现了功能层次和实现层次分离的结构,咱们称之为桥接模式。设计模式

2、代码ide

如上图所示,只有DisplayImpl是抽象类,其余都是具体类,其实DisplayImpl也能够改为接口,这在原理和理念上都是一致的。在实现层次,定义了三个rawXX元,而后对这些元素进行实现(StringDisplayImpl),这样就保证了可扩展性,咱们能够实现不少这样的类,可是高度一直都不变,是一个平行关系。对于功能层次,主要是对实现类中的元素进行操做,一样的使用方法对其进行简单的封装,便于子类的继承和使用,由于咱们定义的displayImpl是私有的,这种组合或者说委托关系,咱们在builder模式中确定很熟悉,这里要说一些区别,首先是思想上的区别,采用桥接模式,就是要将功能层次剥离,所以功能层次上必须有继承,这样才有意义,另外,对于元素的组织上,builder是定义了一个操做,这个操做有顺序的对元素进行处理,不管实现层次上实现了多少个类,都要按照这个顺序来处理,而桥接模式,咱们能够定义新的操做,能够灵活地使用元素,能够随意的增长新的功能,定义新的顺序,这是一个很大的不一样;另外在于main对类的使用上,对于builder模式,咱们可能最后使用对应于实现层次上的一些方法来获得结果,而在桥接模式,咱们原本就是面向接口编程,所以代码中只是使用实现层次中的实现类new一个对象而后就可使用了,没有这种复杂的关联关系。同时关于实现层次的实现类,为了很好的创造对象,咱们可能使用抽象工厂模式来建立对象,须要根据实际状况来取舍。理解了这一点,咱们来看一下代码。函数

DisplayImpl类:虽然是实现层次,但倒是抽象的。组件化

package designMode.bridge;

public abstract class DisplayImpl {
    public abstract void rawOpen();
    public abstract void rawPrint();
    public abstract void rawClose();
}

StringDisplayImpl类:ui

package designMode.bridge;

public class StringDisplayImpl extends DisplayImpl {
    String name;
    public StringDisplayImpl(String name) {
        this.name = name;
    }

    @Override
    public void rawOpen() {
        printline();
    }

    private void printline(){
        System.out.println("===================");
    }

    @Override
    public void rawPrint() {
        System.out.println("|||||"+name+"|||||");
    }

    @Override
    public void rawClose() {
        printline();
    }
}

Display类:this

package designMode.bridge;

public class Display {
    DisplayImpl displayImpl;
    public Display(DisplayImpl displayImpl) {
        this.displayImpl = displayImpl;
    }

    public void open(){
        displayImpl.rawOpen();
    }

    public void print(){
        displayImpl.rawPrint();
    }

    public void close(){
        displayImpl.rawClose();
    }

    public final void display(){
        open();
        print();
        close();
    }
}

CountDisplay类:spa

package designMode.bridge;

public class CountDisplay extends Display {
    public CountDisplay(DisplayImpl displayImpl) {
        super(displayImpl);
    }

    public final void mutilDisplay(){
        open();
        for (int i = 0; i < 5; i++) {
            print();
        }
        close();
    }
}

main类:.net

package designMode.bridge;

public class Main {
    public static void main(String[] args) {
        Display display = new Display(new StringDisplayImpl("江疏影"));
        display.display();
        CountDisplay cd = new CountDisplay(new StringDisplayImpl("素小暖"));
        cd.display();
        cd.mutilDisplay();
    }
}

3、总结设计

从上面咱们能够看到这种方式的实现的好处,首先若是咱们想使用这些元素作其它的事情,咱们只须要继承功能层次的类便可,若是咱们向增长新元素,咱们只须要修改实现层次的上下两层的方法,而后就可使用了,这样思路很是清晰,将功能和组成功能的子功能的实现隔离开来,能够随意的组合,便于组件化编程,好比咱们将实现层次做为组件,咱们只须要使用委托将咱们想要实现的功能托付给实现层次来完成就行了,大大的提升了可重用性。那么到底什么是桥接模式呢,在哪里实现呢?我想你们都知道了,那就是在委托的地方体现了,这就是桥,一座沟通功能层次和实现层次的桥。由此咱们也看到,设计模式其实就是为了最大限度的实现代码的可重用性,为此可谓是绞尽脑汁,实现了以后就可以组件化,可移植,可扩展,从而高内聚低耦合,设计模式,咱们已经渐渐地感觉到了提取的初衷和意义。

 

浅谈设计模式<最通俗易懂的讲解>

相关文章
相关标签/搜索