2007-04-27
Bridge - 桥接模式
关键字: 设计模式意图
将抽象部分与它的实现部分分离,使它们都可以独立地变化。(GoF)
场景
现在我们有很多表要处理,同时又有很多操作要做。最简单的做法是在一个类里做完所有的操作,如我们在EJB服务器端的实现中进行JDBC操作。可是这样一来这个类将无比巨大,大到四只眼(眼睛兄)都看不过来!
有什么好办法能够降低这样操作的杂乱性呢?我们注意到这里有两个概念,分别是“表单(Table)”和“操作(Operator)”。也就是说这里有两个部分——“抽象”和“实现”。我们将这两个部分进行分离,然后根据需要,分别继承和实现表单和操作。这样我们就可以方便地通过表单和操作的组合来实现我们的工作了。
操作如:
java 代码
- Table tbl1 = new Table1(new Insert());
- tbl1.work();
- Table tbl2 = new Table2(new Update());
- tbl2.work();
Table1和Table2都是Table的子类,他们都映射到数据库中特定的表。Insert和Update都是接口Operator的实现,分别完成特定的数据库操作。
好了,下面来先看看Operator的实现代码。
java 代码
- public interface Operator {
- /**
- * 操作
- *
- * @param arg 传入的参数
- * @return 操作结果
- */
- String work(String arg);
- }
我们需要能对数据库进行插入和修改操作,因此分别建立Insert和Update类。
java 代码
- // 插入操作
- public class Insert implements Operator {
- public String work(String arg) {
- String rs = "insert " + arg;
- return rs;
- }
- }
java 代码
- // 修改操作
- public class Update implements Operator {
- public String work(String arg) {
- String rs = "update " + arg;
- return rs;
- }
- }
好了,我们再来看看抽象部分的实现。这里我们的对象是Table。
java 代码
- public abstract class Table {
- // 内置一个操作接口
- protected Operator impl = null;
- public Table(Operator impl) {
- this.impl = impl;
- }
- /**
- * 由子类来具体实现此操作
- */
- public abstract void work();
- }
现在我们有两个表单需要进行操作,他们分别是Table1和Table2。
java 代码
- public class Table1 extends Table {
- public Table1(Operator impl) {
- super(impl);
- }
- public void work() {
- System.out.println(this.impl.work("Table1"));
- }
- }
java 代码
- public class Table2 extends Table {
- public Table2(Operator impl) {
- super(impl);
- }
- public void work() {
- System.out.println(this.impl.work("Table2"));
- }
- }
这样我们在进行数据库的操作的时候,便可以随意地根据实际情况进行表单与操作的组合,将表单与操作桥接在一起来完成我们的任务。
java 代码
- // 对table1进行插入操作
- Table tbl1 = new Table1(new Insert());
- tbl1.work();
- // 对table2进行修改操作
- Table tbl2 = new Table2(new Update());
- tbl2.work();
小结
Bridge设计模式感觉上是通过将对象与操作进行分离,然后对这两个基本概念进行继承及实现,通过对对象及操作的各种组合来完成相应的工作。
P.S.一直想不到一个好的例子来说明Bridge模式,今天吃早饭的时候突然想到可以用来应用于数据库操作。这几天就先按照这种想法做一个demo看看效果如何。呵呵,不知道会不会又是一种重复造轮子的行为呢?不过作为一种实践体会我觉得也很值得。
评论
zijan
2007-10-02
cbhyk 写道
我们平常的XXXService,XXXServiceJdbcImpl,XXXServiceHibernateImpl就是Bridge模式的例子
--说错了,闪
--说错了,闪
没错,说的对。
cbhyk
2007-09-27
我们平常的XXXService,XXXServiceJdbcImpl,XXXServiceHibernateImpl就是Bridge模式的例子
--说错了,闪
--说错了,闪
wangwanttt
2007-09-27
ASDF1982 2007-09-18 15:31
LZ这样做能解决实际问题么,比如查询这一项。
这正开发过程中造成对一个表需要些多个查询方法是因为你的查询条件有很多种,也就是你的查询接口可能有很多种,所以你要写多个查询的接口,这种情况下你是没办法用你这种方法从根本上解决问题的。
还是写多个查询接口,对应多个实现才能解决问题吧。
感觉你举的这个例子不适用
-----------------------------
你这种情况需要使用装饰者模式才能解决,一个设计模式并不能解决所有问题。
LZ这样做能解决实际问题么,比如查询这一项。
这正开发过程中造成对一个表需要些多个查询方法是因为你的查询条件有很多种,也就是你的查询接口可能有很多种,所以你要写多个查询的接口,这种情况下你是没办法用你这种方法从根本上解决问题的。
还是写多个查询接口,对应多个实现才能解决问题吧。
感觉你举的这个例子不适用
-----------------------------
你这种情况需要使用装饰者模式才能解决,一个设计模式并不能解决所有问题。
wangwanttt
2007-09-27
我学了很多设计模式,可是没一个能用到项目中,因为我的项目只是注册,录入,出报表,报表的复杂计算逻辑,全部在存储过程中完成了,如何以设计模式的思考去设计一个系统,真是难啊,楼主有何好经验吗?
wangwanttt
2007-09-27
你应该这样讲吧,桥链模式就是对象与其行为的解藕。这样别人就更容易理解了,加我QQ:124294272希望与你交流心得
wangwanttt
2007-09-27
如何让别人知道我用的是桥模式还是工厂模式呢,代码如此相同?
ASDF1982
2007-09-18
LZ这样做能解决实际问题么,比如查询这一项。
这正开发过程中造成对一个表需要些多个查询方法是因为你的查询条件有很多种,也就是你的查询接口可能有很多种,所以你要写多个查询的接口,这种情况下你是没办法用你这种方法从根本上解决问题的。
还是写多个查询接口,对应多个实现才能解决问题吧。
感觉你举的这个例子不适用
这正开发过程中造成对一个表需要些多个查询方法是因为你的查询条件有很多种,也就是你的查询接口可能有很多种,所以你要写多个查询的接口,这种情况下你是没办法用你这种方法从根本上解决问题的。
还是写多个查询接口,对应多个实现才能解决问题吧。
感觉你举的这个例子不适用
lintomny
2007-09-18
wangwanttt 写道
桥链模式和工厂模式有何区别啊?
出发点不一样。
工厂模式是创建型模式,其目的是为了屏蔽创建复杂多变的的创建过程,只要得到最终的produce就行了。
桥接模式是结构型模式,其目的是通过组合来实现解藕。
wangwanttt
2007-09-14
桥链模式和工厂模式有何区别啊?
lintomny
2007-04-27
咦,咋又出现了呢?差点打算重写。
恩,看来下次不能使用这种编辑模式了。
jamesby 写道
不要使用类word编辑器,用另外一种带标签的.
恩,看来下次不能使用这种编辑模式了。
dovecat
2007-04-27
jamesby 写道
不要使用类word编辑器,用另外一种带标签的.
我现在看到那种WORD格式的就有点怕怕.
jamesby
2007-04-27
不要使用类word编辑器,用另外一种带标签的.
lintomny
2007-04-27
咦,我的文章呢?这个是我原来的草稿啊。刚才补上的内容咋没了呢?
JE的bug?
JE的bug?
- 浏览: 28376 次
- 性别:

- 来自: 广州

- 详细资料
搜索本博客
最新评论
-
Visitor - 访问者模式
楼主大哥的这个vistor模式,小弟偶曾在工商银行取钱时就是这样的,呵呵,更加深 ...
-- by h_yz -
Visitor - 访问者模式
受教了,真的很不错。
-- by wjh0205 -
Visitor - 访问者模式
有一点没说:访问者模式一般用在数据结构稳定的情况下。银行这个例子不是很合适,因为 ...
-- by 渐行渐远 -
Visitor - 访问者模式
lintomny 写道 话说有一个银行,有三个窗口,但是每个窗口的智能都是 ...
-- by farryu -
Visitor - 访问者模式
解释的不错,不过可能稍有点不够详细。
-- by zhangcheng






评论排行榜