设计模式08-桥接模式

1. 概念

将抽象部分和它的实现分离,使他们都可以独立变化

个人理解:将接口(或者抽象类)对象作为业务对象中的成员变量达到“多维度的变化”  ,这里说的多维度变化指的就是一个接口或者抽象类的具体实现是有多个

例如:

interface A{
    //method
}

class Business{
    private A  a  ;  //将接口作为成员变量

    public Business(A a){
        this.a = a ;
   }
}

class  A1 implements A{}
class  A2 implements A{}

2. 具体案例:

/**********************************************************************
 * <pre>
 * FILE : Demo02.java
 * CLASS : Demo02
 *
 * AUTHOR : Liaokailin
 *
 * FUNCTION : TODO
 *
 *
 *======================================================================
 * CHANGE HISTORY LOG
 *----------------------------------------------------------------------
 * MOD. NO.|   DATE   |   NAME  | REASON  | CHANGE REQ.
 *----------------------------------------------------------------------
 *             |2014-3-5|Liaokailin| Created |
 * DESCRIPTION:
 * </pre>
 ***********************************************************************/
package org.demo.brige.demo02;
/**
 * think in patterns 中的例子
 * 桥接模式: 将抽象部分和它的实现分离,使他们都可以独立变化
 *
 * JDK中的JDBC就是桥接模式的经典例子。oracle、mysql、mssqlserver等数据库都有自己的驱动来实现JDBC的接口。如果要修改数据库,只需要修改一下驱动类、URL、用户名、密码,就可以了,其他的增删改查的代码,不需要变。
桥接模式和适配器模式很像,它们有什么区别吗?
桥接模式:先规定接口,再让客户去实现这些接口。比如规定java.sql.Connection,oracle就必须实现java.sql.Connection这个接口。
适配器模式:已经定义了接口,但是和客户要的接口不一致,于是新增接口,用新接口去调用旧的接口。为什么不直接把旧接口改为新接口?因为要保持兼容性啊。比如原来的方法叫method1,现在改为method2,但是其他调用的地方,还是method1,于是就会报找不到method1这个方法。
 * Function :
 * @author : Liaokailin
 * CreateDate : 2014-3-5
 * version : 1.0
 */
public class Demo02 {
    public static void main(String[] args){
        Implementation impl = new Implementation1() ;
        ClientService1 cs = new ClientService1(impl) ;
        cs.service1() ;
        //cs.serviceA() ;
    }
}

//实现 : 属于后端业务代码 对前段不可见

interface  Implementation {
    void facility1() ; //设备1
    void facility2() ; //设备2
    void facility3() ; //设备3
    void facility4() ; //设备4

}

//抽象: 提供给客户端调用的接口 其实现通过Implementation的子类体现 ( 通过成员变量实现两者之间的关联 不通过extends 或者 implements) 

class Abstraction{
    private Implementation implementation ;  //作为成员变量
    public Abstraction(Implementation implementation){
        this.implementation = implementation ;
    }

    public void service1(){
        implementation.facility1() ;
        implementation.facility2() ;
    }

    public void service2(){
        implementation.facility2() ;
        implementation.facility3() ;
    }

    public void service3(){
        implementation.facility1() ;
        implementation.facility2() ;
        implementation.facility4() ;
    }
    // For use by subclasses
    protected Implementation getImplementation(){
        return this.implementation ;
    }

}

class ClientService1 extends Abstraction{

    public ClientService1(Implementation implementation) {
        super(implementation);
    }

    public void serviceA(){
        service1() ;
        service2() ;
     }
    public void serviceB() {
        service3();
     }
}

class ClientService2 extends Abstraction{
    public ClientService2(Implementation implementation) {
        super(implementation);
    }
    public void serviceC(){
        service2() ;
        service3() ;
     }
    public void serviceD() {
        service1();
        service3();
     }

     public void serviceE() {
            getImplementation().facility3();
     }
}

/**
 * 后端的实现不通过其子类实现 而是委派给更深层次的lib库
 * 下面模拟一个lib库 提供若干方法
 */
class Library1{
    public void method1(){
        System.out.println("lib1:method1") ;
    }

    public void method2(){
        System.out.println("lib1:method2") ;
    }
}

class Library2{
    public void operation1(){
        System.out.println("Library2:operation1") ;
    }

    public void operation2(){
        System.out.println("Library2:operation2") ;
    }

    public void operation3() {
        System.out.println("Library2.operation3()");
    }
}
/**
 * 实现的时候调用模拟的系统库中的方法
 */
class Implementation1 implements Implementation{
    private Library1 delegate = new Library1() ;
    @Override
    public void facility1() {
        System.out.println("Implementation1:facility1") ;
        delegate.method1() ;
    }

    @Override
    public void facility2() {
        System.out.println("Implementation1:facility2") ;
        delegate.method2() ;
    }

    @Override
    public void facility3() {
        System.out.println("Implementation1:facility3") ;
        delegate.method2() ;
        delegate.method1() ;
    }

    @Override
    public void facility4() {
          System.out.println("Implementation1.facility4");
           delegate.method1();
    }

}

class Implementation2 implements Implementation {
      private Library2 delegate = new Library2();
      public void facility1() {
        System.out.println("Implementation2.facility1");
        delegate.operation1();
      }
      public void facility2() {
        System.out.println("Implementation2.facility2");
        delegate.operation2();
      }
      public void facility3() {
        System.out.println("Implementation2.facility3");
        delegate.operation3();
      }
      public void facility4() {
        System.out.println("Implementation2.facility4");
        delegate.operation1();
      }
}

设计模式08-桥接模式,布布扣,bubuko.com

时间: 2024-08-03 20:43:18

设计模式08-桥接模式的相关文章

设计模式-08桥接模式(Bridge Pattern)

1.模式动机 设想如果要绘制矩形.圆形.椭圆.正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色.绿色.蓝色等,此时至少有如下两种设计方案: 第一种设计方案是为每一种形状都提供一套各种颜色的版本. 第二种设计方案是根据实际需要对形状和颜色进行组合 对于有两个变化维度(即两个变化的原因)的系统,采用方案二来进行设计系统中类的个数更少,且系统扩展更为方便.设计方案二即是桥接模式的应用.桥接模式将继承关系转换为关联关系,从而降低了类与类之间的耦合,减少了代码编写量. 当然,这

设计模式之桥接模式

桥接模式:实现系统可能有多角度分类,每一种分类都有可能的变化,那么就把这种多角度分离出来让他们独立变化,减少它们之间的耦合 下面的实例是一个手机软件的实例,对于手机来说,我们可以从手机的品牌进行分类,也可以从软件角度分类(功能机),同时手机品牌与手机软件是一个 聚合的关系. 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threadi

JS设计模式(桥接模式)

<!--引入的核心JS文件--> <script type="text/javascript" src="CommonUtil.js"></script> <script type=text/javascript charset=utf-8> <!--JS设计模式(桥接模式)--> //桥接模式:主要是把抽象和现实分离开来,使他们独立开来 //应用场景:事件监听回掉机制 window.onload=func

如何让孩子爱上设计模式 ——10.桥接模式(Bridge Pattern)

如何让孩子爱上设计模式 --10.桥接模式(Bridge Pattern) 我有故事,你有酒吗?这年头写个技术文不讲个故事都不行,行,我讲: 还有发现很多的技术博文都开始有喜欢往文中插入几个表情的趋势了, 但是你真的插的姿势对了吗?这种事情不是随便插的,来来来,给你 见识下如何在适当的场景插入适当的表情以让读者感觉到易可赛艇, 本文以讲故事插表情为主,讲述桥接模式为辅,多图预警, 简书上排版可能有些问题,最佳排版可见: https://www.zybuluo.com/coder-pig/note

【设计模式】——桥接模式

桥接模式(Bridge),将抽象部分与它的实现部分分离,使他们都可以独立地变化. 什么是抽象与它的实现分离,这并不是说,让抽象类与其派生类分离,因为这没有任何意义.实现指的是抽象类和它的派生类用来实现自己的对象.实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让他们独立变化,减少他们之间的耦合.也就是说在我们发现需要多角度去分类实现对象,而只用继承会造成大量的类增加,不能满足开放-封闭原则时,就应该考虑用桥接模式. 桥接模式基本代码 #include <iostrea

设计模式之桥接模式(八)

设计模式之桥接模式 一.引言 每个人都有吃饭睡觉的行为,这时我们可以抽象出来一个人类型,然后让每个人去继承人类型,这时,每增加一个人,我们只需扩展一个子类就可以了,但是,人类型需要增加行为时,比如增加一个玩手机的行为,我们只许在人类型中扩展玩手机这一个方法,但是对于子类来说,如果这时子类数量相当庞大时,子类需要进行大量的修改. 我们可以使用桥接模式,将抽象和实现分离. 二.介绍 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象

初学设计模式之桥接模式

初学设计模式之桥接模式 1.什么是桥接模式 官方解答:将抽象部分与实现部分分离,使它们都独立的变化 2.先感性的认识一下桥接模式 一看这么官方的解释,这车速,有点晕车,没关系,开车之前前咱们先骑自行车感受一下慢速行驶. 假如有一道常识题希望答题人输出的正确 答案为:居里夫人是化学家(干扰因素有雨果.生物学家) 选择题:A  居里夫人是化学家 B  居里夫人是生物学家. C  雨果是化学家 D  雨果是生物学家 连线题:(人名)         是            (头衔) 居里夫人    

图解Java设计模式之桥接模式

图解Java设计模式之桥接模式 手机操作问题 传统方案解决手机操作问题 传统方案解决手机操作问题分析 桥接模式(Bridge)-基本介绍 桥接模式解决手机操作问题 桥接模式在JDBC中的源码解析 桥接模式的注意事项和细节 桥接模式其它应用场景 手机操作问题 现在对不同手机类型的不同品牌实现操作编程(比如 :开机.关机.上网.打电话等等),如图 : 传统方案解决手机操作问题 传统方法对应的类图 传统方案解决手机操作问题分析 1)扩展性问题(类爆炸),如果我们再增加手机的样式(旋转式),就需要增加各

08.设计模式_桥接模式

转自自  http://www.cnblogs.com/zhili/p/AdapterPattern.html 一.引言 这里以电视遥控器的一个例子来引出桥接模式解决的问题,首先,我们每个牌子的电视机都有一个遥控器,此时我们能想到的一个设计是--把遥控器做为一个抽象类,抽象类中提供遥控器的所有实现,其他具体电视品牌的遥控器都继承这个抽象类,具体设计类图如下: 这样的实现使得每部不同型号的电视都有自己遥控器实现,这样的设计对于电视机的改变可以很好地应对,只需要添加一个派生类就搞定了,但随着时间的推

java设计模式之桥接模式

桥接模式 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦.这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类.这两种类型的类可被结构化改变而互不影响.我们通过下面的实例来演示桥接模式(Bridge Pattern)的用法.其中,可以使用相同的抽象类方法但是不同的桥接实现类,来画出不同颜色的圆. 桥接模式所涉及的角色有:抽象化(Abstraction)角色:抽象化给出的