频道栏目
首页 > 资讯 > Java > 正文

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

17-11-18        来源:[db:作者]  
收藏   我要投稿

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

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

一.现实场景:调味搭配

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

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

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

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

三.桥梁模式的类图

1

四.桥梁模式的四种角色

1.抽象化角色(Abstraction):

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

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

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

2.实现化角色(Implementor):

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

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

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

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

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

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

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

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

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

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

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

五.桥梁模式的优点

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

优点

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

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

2.实现对客户透明

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

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

六.桥梁模式的使用场景

1.一个系统需要在构件的抽象化角色和具体化角色之间增加更多灵活性,避免在两个层次之间建立静态的联系。

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

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

相关TAG标签
上一篇:设置elevation后没有用,没有阴影显示怎么解决?
下一篇:git本地文件删除导致git status会显示红色的那个文件
相关文章
图文推荐

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

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