Java设计模式之桥模式(Bridge模式)介绍

Bridge定义:将抽象和行为划分开来,各自独立,但能动态的结合。

为什么使用桥模式

通常,当一个抽象类或接口有多个具体实现(concrete subclass),这些concrete之间关系可能有以下两种:

1.这多个具体实现之间恰好是并列的,如前面举例,打桩,有两个concrete class:方形桩和圆形桩;这两个形状上的桩是并列的,没有概念上的重复,那么我们只要使用继承就可以了。
2.实际应用上,常常有可能在这多个concrete class之间有概念上重叠。那么需要我们把抽象共同部分和行为共同部分各自独立开来,原来是准备放在一个接口里,现在需要设计两个接口,分别放置抽象和行为。

例如,一杯咖啡为例,有中杯和大杯之分,同时还有加奶 不加奶之分。如果用单纯的继承,这四个具体实现(中杯 大杯 加奶 不加奶)之间有概念重叠,因为有中杯加奶,也有中杯不加奶,如果再在中杯这一层再实现两个继承,很显然混乱,扩展性极差。那我们使用Bridge模式来实现它。

如何实现桥模式

以上面提到的咖啡 为例。我们原来打算只设计一个接口(抽象类),使用Bridge模式后,我们需要将抽象和行为分开,加奶和不加奶属于行为,我们将它们抽象成一个专门的行为接口。

先看看抽象部分的接口代码:

代码如下:

public abstract class Coffee{
 CoffeeImp coffeeImp;
 public void setCoffeeImp() {
  this.CoffeeImp = CoffeeImpSingleton.getTheCoffeImp();
 }
 public CoffeeImp getCoffeeImp() {return this.CoffeeImp;}
 public abstract void pourCoffee();
}

其中CoffeeImp 是加不加奶的行为接口,看其代码如下:

代码如下:

public abstract class CoffeeImp{
 public abstract void pourCoffeeImp();
}

现在我们有了两个抽象类,下面我们分别对其进行继承,实现concrete class:

代码如下:

//中杯
public class MediumCoffee extends Coffee{
 public MediumCoffee() {setCoffeeImp();}
 public void pourCoffee(){
  CoffeeImp coffeeImp = this.getCoffeeImp();
  //我们以重复次数来说明是冲中杯还是大杯 ,重复2次是中杯
  for (int i = 0; i < 2; i++){
   coffeeImp.pourCoffeeImp();
  }
 }
}

代码如下:

//大杯

public class SuperSizeCoffee extends Coffee{
 public SuperSizeCoffee() {setCoffeeImp();}
 public void pourCoffee(){
  CoffeeImp coffeeImp = this.getCoffeeImp();
  //我们以重复次数来说明是冲中杯还是大杯 ,重复5次是大杯
  for (int i = 0; i < 5; i++){
   coffeeImp.pourCoffeeImp();
  }
 }
}

上面分别是中杯和大杯的具体实现.下面再对行为CoffeeImp进行继承:

代码如下:

//加奶
public class MilkCoffeeImp extends CoffeeImp{
 MilkCoffeeImp() {}
 public void pourCoffeeImp(){
  System.out.println("加了美味的牛奶");
 }
}

//不加奶
public class FragrantCoffeeImp extends CoffeeImp{
 FragrantCoffeeImp() {}
 public void pourCoffeeImp(){
  System.out.println("什么也没加,清香");
 }
}

Bridge模式的基本框架我们已经搭好了,别忘记定义中还有一句:动态结合,我们现在可以喝到至少四种咖啡:

1.中杯加奶
2.中杯不加奶
3.大杯加奶
4.大杯不加奶

看看是如何动态结合的,在使用之前,我们做个准备工作,设计一个单态类(Singleton)用来hold当前的CoffeeImp:

代码如下:

public class CoffeeImpSingleton{
 private static CoffeeImp coffeeImp;
 public CoffeeImpSingleton(CoffeeImp coffeeImpIn)
 {this.coffeeImp = coffeeImpIn;}
 public static CoffeeImp getTheCoffeeImp(){
  return coffeeImp;
 }
}
看看中杯加奶 和大杯加奶 是怎么出来的:

//拿出牛奶
CoffeeImpSingleton coffeeImpSingleton = new CoffeeImpSingleton(new MilkCoffeeImp());

//中杯加奶
MediumCoffee mediumCoffee = new MediumCoffee();
mediumCoffee.pourCoffee();

//大杯加奶
SuperSizeCoffee superSizeCoffee = new SuperSizeCoffee();
superSizeCoffee.pourCoffee();

注意:Bridge模式的执行类如CoffeeImp和Coffee是一对一的关系,正确创建CoffeeImp是该模式的关键。

Bridge模式在EJB中的应用

EJB中有一个Data Access Object (DAO)模式,这是将商业逻辑和具体数据资源分开的,因为不同的数据库有不同的数据库操作。将操作不同数据库的行为独立抽象成一个行为接口DAO,如下:

1.Business Object (类似Coffee)
实现一些抽象的商业操作:如寻找一个用户下所有的订单。涉及数据库操作都使用DAOImplementor。
 
2.Data Access Object (类似CoffeeImp)
一些抽象的对数据库资源操作。
 
3.DAOImplementor 如OrderDAOCS, OrderDAOOracle, OrderDAOSybase(类似MilkCoffeeImp FragrantCoffeeImp)
具体的数据库操作,如"INSERT INTO "等语句,OrderDAOOracle是Oracle OrderDAOSybase是Sybase数据库。
 
4.数据库 (Cloudscape, Oracle, or Sybase database via JDBC API)

(0)

相关推荐

  • Java中关于控制台读取数字或字符串的方法

    Java中,int a = System.in.read();此句读取的是一个字符,然后返回的是对应字符的ASCII, 例如,控制台输入123,只读取一个字符1,对应的ASCII为49,则输出49,输入abc则读取a,对应的ASCII是97,则输出97: Scanner sc = new Scanner(System.in) int n = sc.nextInt();从控制台读取一个数. String c = sc.next();//从控制台读取字符串 以上就是小编为大家带来的Java中关于控制

  • Java反射之通过反射获取一个对象的方法信息(实例代码)

    以下代码为一个工具类 package com.imooc.reflect; import java.lang.reflect.Method; public class ClassUtil { public static void printClassMessage(Object obj){ //要获取类的信息,首先要获取类的类类型 Class c = obj.getClass();//传递的是哪个子类的对象,c就是该子类的类类型 //获取类的名称 System.out.println("类的名称

  • 浅谈Java的String中的subString()方法

    方法如下: public String substring(int beginIndex, int endIndex) 第一个int为开始的索引,对应String数字中的开始位置, 第二个是截止的索引位置,对应String中的结束位置 1.取得的字符串长度为:endIndex - beginIndex; 2.从beginIndex开始取,到endIndex结束,从0开始数,其中不包括endIndex位置的字符 如: "hamburger".substring(4, 8) returns

  • Java反射之类的实例对象的三种表示方式总结

    如下所示: <span style="font-size:14px;">package com.imooc.reflect; public class ClassDemo1 { public static void main(String[] args) { //Foo的实例对象如何表示 Foo foo1 = new Foo();//foo1就表示出来了 //Foo这个类,也是一个实例对象,Class类的实例对象,如何表示呢. //任何一个类都是Class的实例对象,这个实

  • java 桥模式(Bridge Pattern)详解

    java 桥模式(Bridge Pattern) Bridge模式解耦,其实施的定义.它是一种结构模式.本模式涉及充当桥的接口.这座桥使具体的类独立的接口实施者类. Bridge模式解耦,其实施的定义.它是一种结构模式. 本模式涉及充当桥的接口.这座桥使具体的类独立的接口实施者类. 这两种类型的类可以在不影响彼此被改变. 实例: interface Printer { public void print(int radius, int x, int y); }//from www.j a v a

  • Java反射之静态加载和动态加载的简单实例

    静态加载: package com.imooc.加载类; public class Office_Static { public static void main(String[] args) { //new 创建对象,是静态加载类,在编译时刻就需要加载所有的可能使用到的类 if("Word".equals(args[0])){ Word w = new Word(); w.start(); } if("Excel".equals(args[0])){ Excel

  • java 实现多线程的方法总结

    java 实现多线程的三种方法 在java中,有三种方法可以实现多线程.第一种方法:继承Thread类,重写run函数.第二种方法:实现Runnable接口,重写run函数.第三种方法:实现Callable接口,重写call函数.本文章将通过实例讲解这三种方法如何实现多线程.需要的可以参考一下.  (1)继承Thread类,重写run函数. class xx extends Thread{ public void run(){ Thread.sleep(1000) //线程休眠1000毫秒,sl

  • java 装饰模式(Decorator Pattern)详解

    装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能. 我们通过下面的实例来演示装饰器模式的使用.其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类. 实现 我们将创建一个 Shape 接口和实现了 Shape 接口的实体类.然后我们创建一个实现了 Shape 接口的抽象装饰类Sha

  • Java设计模式之桥梁(Bridge)模式

    桥梁模式的结构 桥梁模式是对象的结构模式. 如上图所示,系统含有两个等级结构: 由抽象化角色和修正抽象化角色组成的抽象化等级结构. 由实现化角色和两个具体实现化角色所组成的实现化等级结构. 桥梁模式所涉及的角色有: 抽象化(Abstraction)角色:抽象化给出的定义,并保存一个对实现化对象的引用. 修正抽象(Refined Abstraction)化角色:扩展抽象化角色,改变和修正父类对抽象化的定义. 实现化(Implementor)角色:这个角色给出实现化角色的接口,但不给出具体的实现.必

  • Java设计模式详解之门面模式(外观模式)

    门面模式(Facade Pattern)也叫外观模式,它隐藏系统的复杂性,并向客户端提供一个可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性,为子系统中的一组接口提供了一个统一的高层访问接口,这个接口使得子系统更容易被访问或使用.这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用. 简而言之,就是把一堆复杂的流程封装成一个接口供给用户更简单的使用,这个设计模式里有三个角色: 1)门面角色( facade ):

  • Java设计模式之观察者模式(Observer模式)

    一.观察者模式是什么? 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern).当一个对象被修改时,则会自动通知依赖它的对象.观察者模式属于行为型模式. 人话: 就像微信公众号推送消息,订阅的人能收到,没订阅的收不到,还可以取消/添加订阅 二.模式分析 2.1 四个角色 抽象主题(抽象被观察者角色):也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者.抽象主题提供一个接口,可以增加和删除观察者角色.一般用一个抽象类和接口来实现

  • Java设计模式之初识行为型模式

    一.行为型模式 行为型模式关注点在于"如何运行对象/类": 行为型模式用来描述程序在运行时复杂的流程控制: 描述多个类或对象之间怎样互相协作共同完成单个对象都无法单独完成的任务,设计算法与对象间职责的分配: 行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为. 二.模板方法模式 在模板模式中,一个抽象类公开定义了执行它的方法的方式模板.它的子类可以按需重写方法实现,但调用将以抽象类中定义的方式进行: 2.1 例子 以做饭举例 模

  • Java设计模式之浅谈模板方法模式

    一. 什么是模板方法设计模式 从字面意义上理解, 模板方法就是定义出来一套方法, 作为模板, 也就是基础. 在这个基础上, 我们可以进行加工,实现个性化的实现.比如:一日餐三. 早餐, 中餐, 晚餐. 每个人都要吃三餐, 但每个人的三餐吃的可能都不一样. 一日三餐定义了模板--早中晚, 每个人的三餐就是模板的具体实现. 1.1 模板方法的用途 将不变的行为从子类搬到超类,去除了子类中的重复代码.规范子类的结构 1.2 模板方法的定义 定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得

  • Java设计模式中的装饰者模式

    目录 模式介绍 UML类图 装饰者模式案例 装饰者模式优点 装饰者模式缺点 模式介绍 23种设计模式之一,英文叫Decorator Pattern,又叫装饰者模式.装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. UML类图 类图解析: Componet:主体 ConcreateComponent:主体具体实现类 Decorator:装饰者 ConcreteDecorate:装饰者具体实现类 装饰者模式案例 背景介绍

  • Java设计模式之桥模式(Bridge模式)介绍

    Bridge定义:将抽象和行为划分开来,各自独立,但能动态的结合. 为什么使用桥模式 通常,当一个抽象类或接口有多个具体实现(concrete subclass),这些concrete之间关系可能有以下两种: 1.这多个具体实现之间恰好是并列的,如前面举例,打桩,有两个concrete class:方形桩和圆形桩:这两个形状上的桩是并列的,没有概念上的重复,那么我们只要使用继承就可以了. 2.实际应用上,常常有可能在这多个concrete class之间有概念上重叠.那么需要我们把抽象共同部分和

  • 对比Java设计模式编程中的状态模式和策略模式

    为了能在Java应用程序中正确的使用状态模式和策略模式,开发人员需要清楚地知道这两种模式之间的区别.尽管状态模式和策略模式的结构非常相似,它们又同样遵循开闭原则,都代表着SOLID设计原则的'O',但它们的意图是完全不同的.Java中的策略模式是对一组相关的算法进行封装,给调用方提供了运行时的灵活性.调用方可以在运行时选择不同的算法,而不用修改使用策略的那个Context类.使用策略模式的经典例子包括实现加密算法,压缩算法,以及排序算法.另一方面,状态模式使用一个对象可以在不同的状态下表现出不同

  • Java设计模式之浅谈外观模式

    目录 简介 外观模式之理解 实例 ①.定义子系统 ②.外观类 ③.测试 好文推荐 简介 外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性. 这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用. 外观模式之理解 对于外观模式,我们可以理解为他是将一些复杂的接口或类进行隐藏,自己暴露出更为简单的操作方法,使得以我们不需要去对复杂方

  • java设计模式学习之简单工厂模式

    简单工厂模式 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现. 利用简单工厂模式设计一个计算器. 1:创建一个运算的类 package EasyFactoryModel; abstract class Operation { public double num1=0;

随机推荐