频道栏目
首页 > 程序开发 > 软件开发 > Java > 正文
java设计模式之桥梁模式讲解
2017-11-18 10:40:24         来源:wenzhi的博客  
收藏   我要投稿

java设计模式之桥梁模式讲解

桥梁模式也称桥接模式,是一种简单但不常使用的设计模式。

一.现实场景:调味搭配

习大和蔡二两人去拉面馆,习大点了一份牛肉拉面,蔡二点了一份牛肉刀削面。面上来后,习大喜欢吃辣椒就添加了一些辣椒调料,蔡二喜欢吃醋就添加了一些醋调料。

上面场景中,面馆把面和调料品分开,让面和调味品独立出来,用用户决定,类似于设计中的桥梁模式。

二.桥梁模式(Bridge Patern)的定义

将抽象和实现解耦,使得两者可以独立地变化。

三.桥梁模式的类图

1

四.桥梁模式的四种角色

1.抽象化角色(Abstraction):

给角色抽象化给出的定义,并保存一个对实现对象化的引用。

比如现实场景中吃的面就是抽象化角色,保持的实现对象引用就是配料接口对象。

实现面接口后可以创建刀削面、拉面、油泼面等等

2.实现化角色(Implementor):

该角色给出实现化角色的接口,但是不给出具体的实现。

这里虽然定义的是实现化角色,其实不是对抽象化角色的实现,而是被抽象化持有的一个接口对象

这里就相当于现实场景中的配料接口对象。实现这个接口可以得到各种调料:柴米油盐酱醋茶等等

3.具体实现化角色(ConcreteImplementor):

该角色对实现化角色接口中的方法进行具体实现。

这里上是实现了上面第二个的实现化角色。

就相当于现实场景中的具体的调料角色,比如辣椒和醋。

4.修正抽象化角色(RefinedAbstraction):

給角色扩展抽象化角色,它引用实现化角色并对抽象化角色进行修正.

这个就是现实场景中的各种主食面

它里面包含了调料接口,创建的时候用调料接口的具体实现类,就相当于持有具体的调料对象了。

五.桥梁模式的优点

桥梁模式虽然四一种使用率不高的模式,但是熟悉该模式对于读者理解面向对象的设计原则,包括开闭原则都很有帮助,有助于设计者形成正确的设计思想和良好的设计风格。

优点

1.抽象和实现分离,四桥梁模式的主要特点

桥梁模式为力解决继承的缺点而提出的设计模式。在该设计模式下,实现可以不受抽象的约束,不用绑定在一个固定的抽象层次上。

2.实现对客户透明

客户不关心实现的细节,它已经由抽象层通过聚合关系完成了封装。

3.提高代码的灵活性和扩展性。

六.桥梁模式的使用场景

2.设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端来说是完全透明的。

3.一个构件有多于一个的抽象化角色和实现化角色,系统需要他们之间进行动态耦合。

4.不希望活着不适合使用继承的场合。

继承具有强入侵性质,即父类有的方法,子类必须有;而桥梁模式是弱关联关系。因此,对于明确不发生变化的,则可以通过继承完成;若不能确定是否发生变化,则通过桥梁模式来解决。

桥梁模式的实例

这里以上面的吃面的现实的现实例子设计代码示例。

实例的类图

2

实例的代码

1.(实现化角色)调料品接口ISeasoning

package p10_bridge;

/**
 * 调味品,佐料接口
 */
public interface ISeasoning {
    //添加调味品、佐料
    String addSeasoning();

}

2.(抽象化角色)面抽象类Noodle

package p10_bridge;

/**
 * 面条,抽象类
 */
public abstract  class Noodle {

    //持有调料接口对象
    ISeasoning seasoning;

    //构造方法,传入调料对象
    public  Noodle(ISeasoning seasoning){//这里传入的调料接口对象,实际是子类的实例化对象,也就是具体的调料对象
        this.seasoning=seasoning;
    }

    //获得面条
    public abstract String getNoodle();

}

3.(具体实现化角色)辣椒调料类Pepper

package p10_bridge;

/**
 * 辣椒类
 */
public class Pepper implements  ISeasoning{
    @Override
    public String addSeasoning() {
        return "添加调料:辣椒";
    }
}

4.(具体实现化角色)醋调料类Vinegar

package p10_bridge;

/**
 * 调料醋的类
 */
public class Vinegar implements  ISeasoning{
    @Override
    public String addSeasoning() {
        return "添加调料:酸醋";
    }
}

5.(修正抽象化角色)拉面对象类RamenNodes

package p10_bridge;

/**
 * 牛肉拉面对象类
 */
public class RamenNodes extends Noodle {

    //构造方法,传入调料接口对象
    public RamenNodes(ISeasoning seasoning) {//ISeasoning在父类已经定义了
        super(seasoning);
    }


    //获取完整的面条内容
    @Override
    public String getNoodle() {
        return seasoning.addSeasoning() + "的牛肉拉面";
    }
}

6.(修正抽象化角色)刀削面对象类SliceNoodles

package p10_bridge;

/**
 * 牛肉刀削面
 * 这里调料是什么要看调料接口的实例化对象是什么
 */
public class SliceNoodles extends Noodle {

    //构造方法,传入调料接口对象
    public SliceNoodles(ISeasoning seasoning) {//ISeasoning在父类已经定义了
        super(seasoning);
    }


    //获取完整的面条内容
    @Override
    public String getNoodle() {
        return seasoning.addSeasoning() + "的牛肉刀削面";
    }
}

7. 桥梁模式测试类BridgeDemo

package p10_bridge;

/**
 * 桥梁模式的测试类
 * 吃面条:习大和蔡二两人去拉面馆,习大点了一份牛肉拉面,蔡二点了一份牛肉刀削面。
 * 面上来后,习大喜欢吃辣椒就添加了一些辣椒调料,蔡二喜欢吃醋就添加了一些醋调料。
 */
public class BridgeDemo {


    public static void main(String[] arg) {
        //创建调料对象,多态用法,父类的对象子类的实例化
        ISeasoning pepper = new Pepper();//辣椒
        ISeasoning vinegar = new Vinegar();//醋

        //面条对象,可以多态,也可以不用
        Noodle ramenNoodle = new RamenNodes(pepper);//拉面加辣椒,如果不用多态:RamenNodes ramenNoodle=new RamenNodes(pepper);
        Noodle sliceNoodles = new SliceNoodles(pepper);//刀削面加醋

        //最终面条成品
        System.out.println("习大吃的是--->" + ramenNoodle.getNoodle());
        System.out.println("蔡二吃的是--->" + sliceNoodles.getNoodle());

    }

}

程序运行的结果:

3

桥梁模式就为大家介绍到这里。

点击复制链接 与好友分享!回本站首页
上一篇:ArcGIS Engine 10.5下构建Java程序的教程
下一篇:java之StringBuffer常见使用方法
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站