Java设计模式之桥接模式

        桥接模式是一种很实用的结构型设计模式,如果软件系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使两者可以独立扩展,让系统更加符合“单一职责原则”。与多层继承方案不同,它将两个独立变化的维度设计为两个独立的继承等级结构,并且在抽象层建立一个抽象关联,该关联关系类似一条连接两个独立继承结构的桥,故名桥接模式。

        桥接模式用一种巧妙的方式处理多层继承存在的问题,用抽象关联取代了传统的多层继承,将类之间的静态继承关系转换为动态的对象组合关系,使得系统更加灵活,并易于扩展,同时有效控制了系统中类的个数。

Bridge接口:

package com.Geeksun.bridge;

public interface Bridge {

    void destination();

}

Bridge实现类

package com.Geeksun.bridge;

public class BridgeA  implements Bridge {
    @Override
    public void destination() {
        System.out.println("to A place");
    }
}


package com.Geeksun.bridge;

public class BridgeB implements Bridge {

    @Override
    public void destination() {
        System.out.println("to B place");
    }
}


package com.Geeksun.bridge;

public class BridgeC implements Bridge {
    @Override
    public void destination() {
        System.out.println("to C place");
    }
}

Area(出发地)抽象类及子类

package com.Geeksun.bridge;

public abstract class Area {

    protected Bridge bridge;

    abstract void fromArea();
}

class Area1 extends Area{

    public Area1(Bridge bridge){
        this.bridge = bridge;
    }

    @Override
    void fromArea() {
        System.out.println("from 1");
        bridge.destination();
    }
}

class Area2 extends Area{

    public Area2(Bridge bridge){
        this.bridge = bridge;
    }

    @Override
    void fromArea() {
        System.out.println("from 2");
        bridge.destination();
    }
}

class Area3 extends Area{

    public Area3(Bridge bridge){
        this.bridge = bridge;
    }

    @Override
    void fromArea() {
        System.out.println("from 3");
        bridge.destination();
    }
}

Client

package com.Geeksun.bridge;

public class Client {

    public static void main(String[] args) {
        Area area = new Area1(new BridgeB());
        area.fromArea();
    }
}

运行结果:

from 1
to B place

如何,只要你认真看完了实例,你就明白了这种模式的好处,现在我们要添加来源地和目的地,只要继续继承AreaA和实现Qiao即可,之前我所说的绑定,正式此处将桥与目的地绑定在一起,使用一个接口完成。

  其实要完成桥接模式,注意点并不多,重在理解模式的使用场景。

  注意点:

    1、定义一个桥接口,使其与一方绑定,这一方的扩展全部使用实现桥接口的方式。

    2、定义一个抽象类,来表示另一方,在这个抽象类内部要引入桥接口,而这一方的扩展全部使用继承该抽象类的方式。

  其实我们可以发现桥接模式应对的场景有方向性的,桥绑定的一方都是被调用者,属于被动方,抽象方属于主动方。

  其实我的JDK提供的JDBC数据库访问接口API正是经典的桥接模式的实现者,接口内部可以通过实现接口来扩展针对不同数据库的具体实现来进行扩展,而对外的仅仅只是一个统一的接口调用,调用方过于抽象,可以将其看做每一个JDBC调用程序(这是真实实物,当然不存在抽象)

  下面来理解一下开头的概念:

  桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。

  这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。

 

  理解:此处抽象化与实现化分别指代实例中的双方,而且实现化对应目的地方(通过实现桥接口进行扩展),抽象方对应来源地方(通过继承抽象类来进行扩展),如果我们不使用桥接模式,我们会怎么想实现这个实例呢?很简单,我们分别定义来源地A1、A2、A3类和目的地B1、B2、B3,然后具体的实现就是,A1到B1一个类,A1到B2一个类,等,如果我们要扩展了A和B ,要直接增加An类和Bn类,如此编写不说类内部重复性代码多,而且还会导致类结构的急剧膨胀,最重要的是,在通过继承实现路径的时候,会造成双方耦合性增大,而这又进一步加剧了扩展的复杂性。使用桥结构模式可以很好地规避这些问题:重在解耦。

转自:http://www.cnblogs.com/V1haoge/p/6497919.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值