`
lintomny
  • 浏览: 225701 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Bridge - 桥接模式

阅读更多

意图
将抽象部分与它的实现部分分离,使它们都可以独立地变化。(GoF)

场景
现在我们有很多表要处理,同时又有很多操作要做。最简单的做法是在一个类里做完所有的操作,如我们在EJB服务器端的实现中进行JDBC操作。可是这样一来这个类将无比巨大,大到四只眼(眼睛兄)都看不过来!

有什么好办法能够降低这样操作的杂乱性呢?我们注意到这里有两个概念,分别是“表单(Table)”和“操作(Operator)”。也就是说这里有两个部分——“抽象”和“实现”。我们将这两个部分进行分离,然后根据需要,分别继承和实现表单和操作。这样我们就可以方便地通过表单和操作的组合来实现我们的工作了。

操作如:

java 代码
 
  1. Table tbl1 = new Table1(new Insert());  
  2. tbl1.work();  
  3.   
  4. Table tbl2 = new Table2(new Update());  
  5. tbl2.work();  

Table1和Table2都是Table的子类,他们都映射到数据库中特定的表。Insert和Update都是接口Operator的实现,分别完成特定的数据库操作。

好了,下面来先看看Operator的实现代码。

java 代码
 
  1. public interface Operator {  
  2.     /** 
  3.      * 操作 
  4.      *  
  5.      * @param arg 传入的参数 
  6.      * @return 操作结果 
  7.      */  
  8.     String work(String arg);  
  9. }  

我们需要能对数据库进行插入和修改操作,因此分别建立Insert和Update类。

java 代码
 
  1. // 插入操作  
  2. public class Insert implements Operator {  
  3.   
  4.     public String work(String arg) {  
  5.         String rs = "insert " + arg;  
  6.         return rs;  
  7.     }  
  8.   
  9. }  

java 代码
 
  1. // 修改操作  
  2. public class Update implements Operator {  
  3.   
  4.     public String work(String arg) {  
  5.         String rs = "update " + arg;  
  6.         return rs;  
  7.     }  
  8.   
  9. }  

好了,我们再来看看抽象部分的实现。这里我们的对象是Table。

java 代码
 
  1. public abstract class Table {  
  2.     // 内置一个操作接口  
  3.     protected Operator impl = null;  
  4.   
  5.     public Table(Operator impl) {  
  6.         this.impl = impl;  
  7.     }  
  8.   
  9.     /** 
  10.      * 由子类来具体实现此操作 
  11.      */  
  12.     public abstract void work();  
  13.   
  14. }  

现在我们有两个表单需要进行操作,他们分别是Table1和Table2。

java 代码
 
  1. public class Table1 extends Table {  
  2.   
  3.     public Table1(Operator impl) {  
  4.         super(impl);  
  5.     }  
  6.  
  7.     public void work() {  
  8.         System.out.println(this.impl.work("Table1"));  
  9.     }  
  10.   
  11. }  

java 代码
 
  1. public class Table2 extends Table {  
  2.   
  3.     public Table2(Operator impl) {  
  4.         super(impl);  
  5.     }  
  6.   
  7.     public void work() {  
  8.         System.out.println(this.impl.work("Table2"));  
  9.     }  
  10.   
  11. }  

这样我们在进行数据库的操作的时候,便可以随意地根据实际情况进行表单与操作的组合将表单与操作桥接在一起来完成我们的任务。

java 代码
 
  1. // 对table1进行插入操作  
  2. Table tbl1 = new Table1(new Insert());  
  3. tbl1.work();  
  4.   
  5. // 对table2进行修改操作  
  6. Table tbl2 = new Table2(new Update());  
  7. tbl2.work();  

小结
Bridge设计模式感觉上是通过将对象与操作进行分离,然后对这两个基本概念进行继承及实现,通过对对象及操作的各种组合来完成相应的工作。

P.S.一直想不到一个好的例子来说明Bridge模式,今天吃早饭的时候突然想到可以用来应用于数据库操作。这几天就先按照这种想法做一个demo看看效果如何。呵呵,不知道会不会又是一种重复造轮子的行为呢?不过作为一种实践体会我觉得也很值得。







分享到:
评论
13 楼 zijan 2007-10-02  
cbhyk 写道
我们平常的XXXService,XXXServiceJdbcImpl,XXXServiceHibernateImpl就是Bridge模式的例子


--说错了,闪


没错,说的对。
12 楼 cbhyk 2007-09-27  
我们平常的XXXService,XXXServiceJdbcImpl,XXXServiceHibernateImpl就是Bridge模式的例子


--说错了,闪
11 楼 wangwanttt 2007-09-27  
ASDF1982     2007-09-18 15:31
LZ这样做能解决实际问题么,比如查询这一项。
这正开发过程中造成对一个表需要些多个查询方法是因为你的查询条件有很多种,也就是你的查询接口可能有很多种,所以你要写多个查询的接口,这种情况下你是没办法用你这种方法从根本上解决问题的。
还是写多个查询接口,对应多个实现才能解决问题吧。
感觉你举的这个例子不适用

-----------------------------
你这种情况需要使用装饰者模式才能解决,一个设计模式并不能解决所有问题。
10 楼 wangwanttt 2007-09-27  
我学了很多设计模式,可是没一个能用到项目中,因为我的项目只是注册,录入,出报表,报表的复杂计算逻辑,全部在存储过程中完成了,如何以设计模式的思考去设计一个系统,真是难啊,楼主有何好经验吗?
9 楼 wangwanttt 2007-09-27  
你应该这样讲吧,桥链模式就是对象与其行为的解藕。这样别人就更容易理解了,加我QQ:124294272希望与你交流心得
8 楼 wangwanttt 2007-09-27  
如何让别人知道我用的是桥模式还是工厂模式呢,代码如此相同?
7 楼 ASDF1982 2007-09-18  
LZ这样做能解决实际问题么,比如查询这一项。
这正开发过程中造成对一个表需要些多个查询方法是因为你的查询条件有很多种,也就是你的查询接口可能有很多种,所以你要写多个查询的接口,这种情况下你是没办法用你这种方法从根本上解决问题的。
还是写多个查询接口,对应多个实现才能解决问题吧。
感觉你举的这个例子不适用
6 楼 lintomny 2007-09-18  
wangwanttt 写道
桥链模式和工厂模式有何区别啊?


出发点不一样。
工厂模式是创建型模式,其目的是为了屏蔽创建复杂多变的的创建过程,只要得到最终的produce就行了。
桥接模式是结构型模式,其目的是通过组合来实现解藕。
5 楼 wangwanttt 2007-09-14  
桥链模式和工厂模式有何区别啊?
4 楼 lintomny 2007-04-27  
咦,咋又出现了呢?差点打算重写。

jamesby 写道
不要使用类word编辑器,用另外一种带标签的.


恩,看来下次不能使用这种编辑模式了。
3 楼 dovecat 2007-04-27  
jamesby 写道
不要使用类word编辑器,用另外一种带标签的.
我现在看到那种WORD格式的就有点怕怕.
2 楼 jamesby 2007-04-27  
不要使用类word编辑器,用另外一种带标签的.
1 楼 lintomny 2007-04-27  
咦,我的文章呢?这个是我原来的草稿啊。刚才补上的内容咋没了呢?
JE的bug?

相关推荐

    设计模式---桥接模式

    桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立进行变化。这种模式在软件工程中被广泛应用于处理组件之间的耦合问题,特别是当需要为同一抽象提供多种实现或者需要独立地改变它们时。 ...

    c++设计模式-结构型模式-桥接模式

    c++设计模式-结构型模式-桥接模式;qt工程,c++简单源码; 桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度...

    设计模式 - 桥接模式(C++实例)

    桥接模式是一种结构型设计模式,它将抽象部分与其实现部分分离,使得它们可以独立地进行变化。在C++编程中,桥接模式能够帮助我们设计出更灵活、可扩展的系统,允许我们在不修改原有代码的基础上更换或增加新的实现...

    java常用设计模式-桥接模式

    桥接模式(Bridge Pattern)是一种常用的设计模式,它将抽象化和实现化解耦,使用封装、聚合以及继承等基本技术,将两个独立变化的维度通过抽象化的方式进行桥接,从而降低了它们之间的耦合度,使得系统更加灵活。...

    Bridge 桥接模式(结构型模式)

    桥接模式(Bridge Pattern)是一种结构型设计模式,它的主要目的是将抽象部分与实现部分分离,使得它们可以独立地进行变化。在软件工程中,这种分离有助于降低复杂性,提高代码的可维护性和可扩展性。桥接模式的核心...

    Bridge 桥接模式

    C#面向对象设计模式 Bridge 桥接模式 视频讲座下载

    无线组网-桥接

    它分为点对点桥接和点对多点桥接两种模式。点对点桥接适用于两个无线设备之间的连接,而点对多点桥接则适用于一个主AP与多个从AP之间的连接,以实现更广泛的网络覆盖。 例如,在一个住宅小区,住户A有一个ADSL宽带...

    C#面向对象设计模式纵横谈(8):Bridge 桥接模式(结构型模式)

    桥接模式(Bridge Pattern)是面向对象设计中的一种结构型模式,它将抽象部分与实现部分分离,使得它们可以独立地进行变化。在C#编程中,桥接模式的应用能够帮助我们更好地解耦系统,提高代码的灵活性和可扩展性。 ...

    桥接模式和策略模式的区别,内含可运行代码和两者详细区别

    首先,桥接模式(Bridge Pattern)的核心思想是“分离抽象与实现”。它通过建立一个抽象层和一个实现层的独立继承体系,使得抽象部分和实现部分可以独立变化,形成一种解耦的设计。在桥接模式中,抽象类引用实现类的...

    C#面向对象设计模式纵横谈(8):Bridge 桥接模式(结构型模式) (Level 300)

    桥接模式(Bridge Pattern)是一种结构型设计模式,它旨在将抽象部分与其实现部分分离,使得它们可以独立地进行变化。在C#编程中,这种模式尤其有用,因为随着软件系统的复杂性增加,类的继承层次可能会变得难以管理...

    设计模式之桥接模式BridgePattern

    桥接模式(Bridge Pattern)是设计模式中的一种结构型模式,它主要解决的是在软件设计中,当抽象和实现之间存在紧密耦合时,如何使这两者能够独立地变化。这种模式通过引入一个抽象层来分离接口和实现,使得它们可以...

    c++-设计模式之桥接模式(Bridge Pattern)

    桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分与实现部分分离,使得两者可以独立地变化。这种模式常用于需要在多个维度上变化的场景,比如不同的形状和颜色,允许在不改变客户端代码的情况下增加新...

    设计模式面面观(10):桥接模式(Bridge Pattern)-结构型模式

    创建型模式 (100%) 设计模式面面观(8):创建型模式总结 (100%) 设计模式面面观(9):适配器模式(Adapter Pattern)-结构型模式 (100%) 设计模式面面观(10):桥接模式(Bridge Pattern)-结构型模式 ...

    Linux虚拟机网络配置-桥接网络配置

    如果缺少VMnet0,点击“更改设置”,然后选择“添加网络”,在弹出的对话框中选择“桥接模式”,并指定桥接的物理网卡,通常这个网卡的描述会在Windows网络属性中找到。 4. 在Linux虚拟机内部,网络配置也很关键。...

    设计模式的桥接模式的例子

    桥接模式是设计模式中的一种结构型模式,它旨在将抽象部分与实现部分解耦,使得它们可以独立地变化。这种模式将抽象类和它的实现类进行分离,通过一个抽象接口来连接它们,使得两者可以独立发展,增加了系统的灵活性...

    cpp代码-设计模式-桥接模式

    今天我们将深入探讨其中的一种——桥接模式(Bridge Pattern)。桥接模式是一种结构型设计模式,它将抽象部分与其实现部分分离,使得两者可以独立进行变化。这种模式在C++编程中尤其有用,因为它允许我们创建灵活且...

    结构型模式之桥接模式(bridge)

    桥接模式是设计模式中的一种结构型模式,其主要目的是为了分离抽象部分和实现部分,以便两者能够独立地进行变化。这种模式的核心理念是通过引入一个抽象层来封装多种可能的实现,使得抽象和实现之间形成一种“桥接”...

    cisco路由器桥接模式

    在思科路由器中,桥接模式可以通过bridge-group命令来实现。bridge-group命令用于将多个接口组合成一个桥接域,并将其作为一个逻辑接口对待。下面是一个路由器桥接的配置命令: ``` router#sh ru Building ...

    C# 设计模式系列教程-桥接模式

    为了解决这种多维度变化,又不引入复杂度,这就要使用Bridge模式。 3. 模式中的角色  2.1 抽象(Abstraction):定义抽象接口,该接口中包含实现具体行为、具体特征的Implementor接口。  2.2 提炼的抽象...

Global site tag (gtag.js) - Google Analytics