>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 26533 个阅读者 刷新本主题
 * 贴子主题:  Java设计模式:桥接模式 回复文章 点赞(0)  收藏  
作者:flybird    发表时间:2019-08-16 20:35:08     消息  查看  搜索  好友  邮件  复制  引用

  

桥接模式

         桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。

         这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。

         我们通过下面的范例来演示桥接模式(Bridge Pattern)的用法。其中,可以使用相同的抽象类方法但是不同的桥接实现类,来画出不同颜色的圆。            

介绍

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

         主要解决:在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。

         何时使用:实现系统可能有多个角度分类,每一种角度都可能变化。

         如何解决:把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合。

         关键代码:抽象类依赖实现类。

         应用范例:

1、猪八戒从天蓬元帅转世投胎到猪,转世投胎的机制将尘世划分为两个等级,即:灵魂和肉体,前者相当于抽象化,后者相当于实现化。生灵通过功能的委派,调用肉体对象的功能,使得生灵可以动态地选择。

2、墙上的开关,可以看到的开关是抽象的,不用管里面具体怎么实现的。

         优点:

1、抽象和实现的分离。

2、优秀的扩展能力。

3、实现细节对客户透明。

         缺点:桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。

         使用场景:

1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。

2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。

3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。

            注意事项:对于两个独立变化的维度,使用桥接模式再适合不过了。            

实现

     我们有一个作为桥接实现的 DrawAPI 接口和实现了 DrawAPI 接口的实体类 RedCircle、GreenCircle。Shape 是一个抽象类,将使用 DrawAPI 的对象。BridgePatternDemo,我们的演示类使用 Shape 类来画出不同颜色的圆。

    点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

步骤 1

      创建桥接实现接口。                      

DrawAPI.java

public   interface   DrawAPI   {
    public   void   drawCircle ( int   radius ,  int   x ,  int   y ) ;
}        

步骤 2

     创建实现了 DrawAPI 接口的实体桥接实现类。                      

RedCircle.java

public   class   RedCircle   implements   DrawAPI   {
   @ Override
    public   void   drawCircle ( int   radius ,  int   x ,  int   y )   {
       System . out . println ( " Drawing Circle[ color: red, radius:  "
         +  radius  + " , x:  "  + x + " ,  " +  y  + " ] " ) ;
    }
}

GreenCircle.java

public   class   GreenCircle   implements   DrawAPI   {
   @ Override
    public   void   drawCircle ( int   radius ,  int   x ,  int   y )   {
       System . out . println ( " Drawing Circle[ color: green, radius:  "
         +  radius  + " , x:  "  + x + " ,  " +  y  + " ] " ) ;
    }
}

步骤 3

     使用 DrawAPI 接口创建抽象类 Shape。                      

Shape.java

public   abstract   class   Shape   {
    protected   DrawAPI   drawAPI ;
    protected   Shape ( DrawAPI   drawAPI ) {
       this . drawAPI  =  drawAPI ;
    }
    public   abstract   void   draw ( ) ;  
}

步骤 4

     创建实现了 Shape 接口的实体类。                      

Circle.java

public   class   Circle   extends   Shape   {
    private   int   x ,  y ,  radius ;

    public   Circle ( int   x ,  int   y ,  int   radius ,  DrawAPI   drawAPI )   {
       super ( drawAPI ) ;
       this . x  =  x ;  
       this . y  =  y ;  
       this . radius  =  radius ;
    }

    public   void   draw ( )   {
       drawAPI . drawCircle ( radius , x , y ) ;
    }
}

步骤 5

     使用 Shape 和 DrawAPI 类画出不同颜色的圆。                      

BridgePatternDemo.java

public   class   BridgePatternDemo   {
    public   static   void   main ( String [ ]   args )   {
       Shape   redCircle  =  new   Circle ( 100 , 100 ,  10 ,  new   RedCircle ( ) ) ;
       Shape   greenCircle  =  new   Circle ( 100 , 100 ,  10 ,  new   GreenCircle ( ) ) ;

       redCircle . draw ( ) ;
       greenCircle . draw ( ) ;
    }
}

步骤 6

     执行程序,输出结果:

Drawing Circle[ color: red, radius: 10, x: 100, 100]

Drawing Circle[  color: green, radius: 10, x: 100, 100]




程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-02-15 12:16:52 重新编辑]
  Java面向对象编程-->多线程(上)
  JavaWeb开发-->Servlet技术详解(Ⅲ)
  JSP与Hibernate开发-->立即检索和延迟检索策略
  Java网络编程-->安全网络通信
  精通Spring-->Vue组件开发高级技术
  Vue3开发-->通过Axios访问服务器
  Java集合框架学习---深入探究ArrayList源码
  序列化与反序列化知识点汇总
  Java设计模式:接口隔离原则和迪米特法则详解
  我是如何把一个15分钟的程序优化到了10秒的
  被迫重构代码,这次我干掉了 if-else
  [讨论]书中多线程章节的语言表述有误?
  内部类的种类和用法
  java万年历简单制作
  JAVA常用数据结构
  Eclipse使用指南:创建Java项目的步骤
  Eclipse使用指南:工作空间(Workspace)
  Java 入门实用代码:从 List列表中 截取子列表
  Java入门实用代码:数组转集合
  关于Java中try finally return语句的执行顺序浅析
  Java中的main()方法详解
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。