`
xly_971223
  • 浏览: 1266763 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

桥梁模式 ----- bridge

阅读更多
桥梁模式的用意是将问题的抽象和实现分离开来实现,通过用聚合代替继承来解决子类爆炸性增长的问题。
比如我们有一个画图程序 有2个图形(Circle Rectangle )和2种画图方法(Drawing1 Drawing2)
图形可能会使用Drawing1来画图 也可能使用Drawing2来画图
在这个画图程序中有两个可变因素 一个是图形的种类 有可能会增加新的图形 另一个是画图方法 可能会有Drawing3出现
当系统有两个可变因素时 我就应该考虑到桥梁模式,至少它应该在你的脑子里闪过
在面向对象设计中有两条重要原则
1.找出变化并封装之
2.优先使用聚合而不是继承


这两条将在桥梁模式中得到完美体现

在上例中图形是一个变化 我们可以抽象出一个形状接口 和 一些形状类
interface Shape{
    void doDraw();
}
class Circle implements Shape{}
class Rectangle implements Shape{}


画图方法也可以抽象出一个Drawing接口 和 各种画法
interface Drawing{
    void draw();
}
class Drawing1 implements Drawing{}
class Drawing2 implements Drawing{}

最后将两个变化联系起来
在问题域中是图形使用画图方法 所有应该在Shape中使用Drawing
我们可以通过在具体的图形类中通过构造函数传入具体的画图方法来实现
如下

class Circle implements Shape{
    private Drawing drawing; 
    public Circle(Drawing drawing){
        this.drawing = drawing;
    }

    public void doDrow(){
        drawing.draw();
    }
}

class Client(){
    public static void main(String[] args){
        Shape circle = new Circle(new Drawing2());
        circle.draw();
    }
}


仔细体会了一下桥梁模式,感觉凡是‘调用和实现’之间的问题都可以用桥梁模式解决
比如说Dao层给Service层之间的调用,service作为调用方 dao为实现方
只不过service层只有一种实现罢了,可以看作是一种简化了的桥梁模

dao 可能有 HibernateDao JdbcDao。
service 使用dao
如下
interface Dao{
    List findAll();
}
class HibernateUserDao implements Dao{}
class JdbcUserDao implements Dao{}

interface UserService{
    List findAllUser();
}

class UserServiceImpl implements UserService{
    private Dao dao;
    public UserServiceImpl(Dao dao){
        this.dao = dao;
    }

    public List findAllUser(){
        dao.findAll();
    }
}

这个代码是不是给上面的画图程序很类似呢
不同之处就是service层只有一个实现UserServiceImpl
所以说是这是一种简化了的桥梁
分享到:
评论
8 楼 phoenix 2007-03-07  
鼓掌,写的简单易懂,很好,谢谢!
7 楼 intolong 2007-03-05  
xly_971223 写道
intolong 写道
lz给的例子抽象出shape没什么意义,shape应该不仅仅是doDraw()


请给出你的代码


概念是对的,但例子没足够说明。
Circle和Rectangle的那个变化没体现出来,如果只是直接委托给drawing,不做别的事。
吹毛求疵了,呵呵。
6 楼 xly_971223 2007-03-05  
intolong 写道
lz给的例子抽象出shape没什么意义,shape应该不仅仅是doDraw()


请给出你的代码
5 楼 intolong 2007-03-05  
lz给的例子抽象出shape没什么意义,shape应该不仅仅是doDraw()

不过注意封装变化和DI,很多模式都可以自己推出来
4 楼 aone 2007-03-05  
嗯,是时候研究一下设计模式了!!!
3 楼 xinmen220 2007-03-05  
楼主讲述的很不错.很容易懂..谢谢..辛苦了
2 楼 scuhao 2007-03-05  
复杂问题简单化,通俗易懂,谢谢楼主!
1 楼 jamesby 2007-03-04  
建议楼主整理出一篇文章,包含常用的23种模式,最关键的是详细说明每一个模式的使用场景,碰到一种问题立刻能够知道我的这个问题可以用哪种模式可以实现,或者类似哪种模式.

相关推荐

    设计模式C++学习之桥梁模式(Bridge)

    设计模式C++学习之桥梁模式(Bridge)

    学习php设计模式 php实现桥梁模式(bridge)

    一、桥梁模式结构图   二、桥梁模式中主要角色 抽象化(Abstraction)角色:定义抽象类的接口并保存一个对实现化对象的引用。 修正抽象化(Refined Abstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义...

    hassio-ring-bridge:家庭助理插件 (Hassio) 充当 Ring API 的桥梁

    家庭助理的环桥,暴露获取/设置位置模式。 Ring 令牌会自动刷新。 该桥接器可用于根据居民的自动存在检测自动设置环形定位模式,从而在家里启用混合传感器和全自动报警系统,例如以下内容。 安装 在 Home Assistant...

    bridge-example:马尔马拉大学 OOP 课堂作业 - 桥梁设计模式示例

    桥接示例马尔马拉大学 OOP 课堂作业 - 桥梁设计模式示例

    C#设计模式.PDF

    六、 在什么情况下应当使用桥梁模式 158 设计模式(17)-Chain of Responsibility Pattern 158 一、 职责链(Chain of Responsibility)模式 160 二、 责任链模式的结构 160 三、 责任链模式的示意性源代码 160 四...

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    11、桥梁模式BRIDGE PATTERN 12、命令模式COMMAND PATTERN 13、装饰模式DECORATOR PATTERN 14、迭代器模式ITERATOR PATTERN 15、组合模式COMPOSITE PATTERN 16、观察者模式OBSERVER PATTERN 17、责任链模式 18、...

    C#设计模式大全

    六、 在什么情况下应当使用桥梁模式 设计模式(17)-Chain of Responsibility Pattern 一、 职责链(Chain of Responsibility)模式 二、 责任链模式的结构 三、 责任链模式的示意性源代码 四、 纯的与不纯的...

    bridge-v2:剃刀→其他区块链桥

    遍历到bridge-v2 。 cd bridge-v2 通过npm安装 如果要通过npm安装,请遵循以下说明。 如果您要通过yarn安装,请跳至 npm i 要在开发模式下运行该应用程序,请使用此命令。 npm run dev 通过yarn安装 要安装依赖...

    secret-bridge:监控Github中泄露的秘密

    秘密桥一座桥梁,可帮助您提高检测Github上共享的秘密的能力。 有关该方法的更多详细信息,请参见我们的。这个怎么运作有两种方法可以运行: 事件轮询-在这种模式下,脚本会轮询组织,开发人员,集合或存储库的 。 ...

    微前端iframe双向通信TS编译npm仓储源码

    2.发送消息时不支持消息的回调,也就是说发布订阅模式,不支持同一条消息的反向通信 综上两个问题给开发造成了很多设计及代码量上的麻烦 利用window对象提供的以上方法,我们做一下简单的封装,能很好地解决以上两...

    Bridge-school:桥梁学校网站

    该主题包含几个内容部分,具有悬停效果的响应式投资组合网格,整页投资组合项目模式,响应式时间表和有效PHP联系人表格。 预览 地位 下载及安装 要开始使用此模板,请选择以下选项之一以开始使用: 通过npm安装: ...

    JAVA设计模式.rar

    策略模式【STRATEGY PATTERN】 ...桥梁模式【BRIDGE PATTERN】  命令模式【COMMAND PATTERN】  装饰模式【DECORATOR PATTERN】 迭代器模式【ITERATOR PATTERN】  组合模式【COMPOSITE PATTERN】 ......

    PHP设计模式(六)桥连模式Bridge实例详解【结构型】

    本文实例讲述了PHP设计模式:桥连模式Bridge。分享给大家供大家参考,具体如下: 1. 概述  在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向...

    bridge-the-gap:js13kGames 2015的入门游戏

    反转模式REVERSED模式以非周期性的方式(以随机间隔)设置,建筑物交换位置,并且玩家必须在相反的方向上架桥(从Right到Left)。技术该游戏是使用HTML5,CSS3和JavaScript开发的。 使用CSS3的动画和过渡使用

    源码:阎宏设计模式光盘

    com.javapatterns.bridge 桥梁模式 com.javapatterns.builder 建造者模式 com.javapatterns.carp 组合/聚合复用原则 com.javapatterns.chainofresp 责任链模式 com.javapatterns.chainofresp.scheduler 专题:...

    dp-bridge:桥接DP的实现示例

    桥梁设计模式示例 尽管此项目不是基于任何特定的教程,但是在实现代码时,我主要使用解释作为主要参考。 项目概况 该项目没有GUI,因为目标是了解结构。 我们的想法是,我们有三个要应用于数据的过滤器。 ...

    java设计的4种模式

    如桥梁模式(Bridge Pattern) 定义:Decouple an abstraction from its implementation so that the two can vary independently.(将抽象和实现解耦,使得两者可以独立地变化。) ● Abstraction——抽象化角色 它...

    rn-firebase-bridge:React本机Firebase桥

    React本机Firebase桥通往适用于iOS和Android的本地Firebase SDK的桥梁。 iOS和Android SDK支持离线模式,而节点/ Web SDK不支持。安装npm install --save rn-firebase-bridgereact-native link的iOS 在按照说明将iOS...

    C#23种设计模式_示例源代码及PDF

    桥梁模式:将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关 桥梁模式 联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是 继承关系,从而使两者可以独立的...

Global site tag (gtag.js) - Google Analytics