原文:http://chjking.blog.163.com/blog/static/6439511120081152534252/

看了网上一些关于咖啡加奶的例子,觉得真是天下文章一大抄,不管好的坏的都照搬,于是在原有的基础上进行了重新编写,代码也已经过测试。

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

这句话是对的,但理解起来较为困难。可以这么理解,抽象是一个事物的本身的特征,行为是一个事物可以做的动作,特征是相对独享的,行为是可以共享的。举例:不同的数据库,它们具有不同的特征,比如URL,驱动这些每个数据库都不能共享,就是所谓抽象。而每个数据库都具有类似的行为,插入,删除,修改等等,这些操作是可以和共享的,就是所谓行为。

为什么使用?

一句话可以概括,解耦合。

以数据库为例,当使用不同数据库时,不需要对其行为部分代码进行修改,当添加新的行为时,也不需要对数据库特征部分进行修改,就可以使所有存在数据库共享这一行为。

如何实现?

以下代码改编自网上:

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

首先是咖啡可以进行的行为的父接口:(加奶,不加奶)

public interface CoffeeImpl {
     public String pourCoffeeImpl();
}

下面两个是行为的具体的实现子类

加奶

public class MilkCoffeeImpl implements CoffeeImpl {

public String pourCoffeeImpl() {
          System.out.println("add milk");
          return "add milk";
     }

}

不加奶

public class FragrantCoffeeImpl implements CoffeeImpl {

public String pourCoffeeImpl() {
          System.out.println("no milk");
          return "no milk";
     }

}

下面是咖啡的抽象父类,也就是区分大杯和中杯

public abstract class Coffee {
     CoffeeImpl coffeeImpl;

public CoffeeImpl getCoffeeImpl() {
          return coffeeImpl;
     }

public void setCoffeeImpl(String way) {
          this.coffeeImpl = ActionFactory.createCoffeeImpl(way);
     }
 
     public abstract void pourCoffee();
}

下面是2个抽象的具体实现子类

大杯

public class BigCoffee extends Coffee {
 
     public BigCoffee(String way) {
          pourCoffee();
          this.setCoffeeImpl(way);
          this.coffeeImpl.pourCoffeeImpl();
     }
 
     @Override
     public void pourCoffee() {
          System.out.print("Big coffee ");
     }

}

中杯

public class MiddleCoffee extends Coffee {
 
     public MiddleCoffee(String way) {
          pourCoffee();
          this.setCoffeeImpl(way);
          this.coffeeImpl.pourCoffeeImpl();
     }

@Override
     public void pourCoffee() {
          System.out.print("Middle coffee ");
     }

}

下面是一个简单工厂,用来动态确定咖啡的行为,究竟是加奶还是不加奶,当然可以使用自己定义的方法来实现这个功能,这里我选择简单工厂。

public class ActionFactory {
     public static CoffeeImpl createCoffeeImpl(String way) {
          if("milk".equals(way)) {
               return new MilkCoffeeImpl();
          } else if("fragrant".equals(way)) {
               return new FragrantCoffeeImpl();
          } else {
               return null;
          }
     }   
}

到此为止,bridge模式就完成了,读者可以很方便的自己试试着这个基础上添加自己的咖啡抽象,比如小杯咖啡,还能添加咖啡行为,比如加糖不加糖,记得需要对简单工厂进行修改。

最后就是测试类

public class Test {

/**
  * @param args
  */
 public static void main(String[] args) {
       //中杯不加奶
      Coffee coffee1 = new MiddleCoffee("fragrant");
      //大杯加奶
      Coffee coffee2 = new BigCoffee("milk");
      //中杯加奶
      Coffee coffee3 = new MiddleCoffee("milk");
      //大杯不加奶
      Coffee coffee4 = new BigCoffee("fragrant");
 }

}

完成了,输出结果是:

Middle coffee no milk
Big coffee add milk
Middle coffee add milk
Big coffee no milk

可以看到调用很方便,类决定了什么样的咖啡(抽象),而参数决定了什么样的操作(行为)。

java 实现Bridge模式(转)的更多相关文章

  1. 设计模式(java)--Bridge模式之蜡笔与毛笔的故事

    转自:吕震宇 http://www.cnblogs.com/zhenyulu/articles/67016.html#!comments 我想大家小时候都有用蜡笔画画的经历吧.红红绿绿的蜡笔一大盒,根 ...

  2. Java设计模式(6)桥模式(Bridge模式)

    Bridge定义:将抽象和行为划分开来,各自独立,但能动态的结合. 为什么使用桥模式 通常,当一个抽象类或接口有多个具体实现(concrete subclass),这些concrete之间关系可能有以 ...

  3. Java 实现桥接(Bridge)模式

    类图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamp3d21scDQ1Ng==/font/5a6L5L2T/fontsize/400/fill/I0 ...

  4. 设计模式之桥接模式(Bridge模式)

    我想大家小时候都有用蜡笔画画的经历吧.红红绿绿的蜡笔一大盒,根据想象描绘出格式图样.而毛笔下的国画更是工笔写意,各展风采.而今天我们的故事从蜡笔与毛笔说起. 设想要绘制一幅图画,蓝天.白云.绿树.小鸟 ...

  5. 设计模式初探-桥接(Bridge)模式

    桥接(Bridge)模式,又称Handle/Body模式,属于对象结构型模式.用于将抽象部分与它的实现部分分离,使它们都可以独立地变化.比如常见的电脑窗口界面,不同的操作系统其窗口界面绘制的原理肯定不 ...

  6. Android中Adapter和Bridge模式理解和应用

    一 Adapter模式 意图: 将一个类的接口转换成客户希望的另外一个接口. Adapter模式使得原本由于接口不兼容而不能在一起工作的那些类可以在一起工作. 适用性: 使用一个已存在的类,而它的接口 ...

  7. 设计模式(7)-结构型模式-Bridge模式

    2.结构性模式 2.2  BRIDGE模式 别名:handle/body 这个模式体现了组合相对于继承的优势. 2.2.1动机 当一个抽象可能有多个实现时,通经常使用继承来协调它们.抽象类定义对该抽象 ...

  8. 【设计模式】Java设计模式 - 桥接模式

    [设计模式]Java设计模式 - 桥接模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起 ...

  9. Bridge模式——对象结构型模式

    今天看了Bridge模式,对其进行简单的总结,并给出几篇通俗易懂的文章链接. (一)意图--将抽象部分和它的实现部分分离,使它们都可以独立地变化. 适用于从多维度描述的类型,拆解开来,使其能沿着各维度 ...

随机推荐

  1. IRQL Ring0实现

    一,IRQL的定义Interrupt ReQuest Level     DDK对IRQL的定义是:中断请求级(IRQL)标示中断的优先级.处理器在一个IRQL上执行线程代码,IRQL是帮助决定线程如 ...

  2. centos6.8下pptp客户端的安装配置

    原文: https://blog.csdn.net/zhang11321132/article/details/20612473 yum -y install ppp pptp pptp-setup ...

  3. docker设置容器固定ip

    docker安装后,默认会创建三种网络类型,bridge.host和none,可通过如下命令查看 sudo docker network ls 1 bridge:网络桥接 默认情况下启动.创建容器都是 ...

  4. sqoop导出mysql数据进入hive错误

    看mr的运行显示:sqoop job可以获得的select max(xxx)结果,但是当mr开始时却显示大片错误,就是连接超时,和连接重置等问题, 最后去每个节点ping mysql的ip地址,发现 ...

  5. iOS NSUserDefaults

    一.介绍 NSUserDefaults适合存储请练级的本地数据,对于一些简单的数据(NSString类型)来说是首选,但是如果我们自定义了一个对象,对象保存的是一些信息,这是就不能直接存储到NSUse ...

  6. Android蓝牙BLE开发,扫描、连接、发送和读取信息;

    1.BLE开发权限 Android蓝牙BLE开发须打开蓝牙权限和6.0位置权限: <uses-permission android:name="android.permission.B ...

  7. crawlspider 多分页处理

    提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法二:基 ...

  8. PowerDesigner 概念数据模型(CDM) 说明

        ref: https://blog.csdn.net/tianlesoftware/article/details/6871179 关于PowerDesigner的说明参考: PowerDes ...

  9. 性能测试day01_性能基本概念

    其实第一次接触性能是15年的时候,懵懵懂懂的被领导拉去做第一次做性能压测,如今有机会重新听一下云层大大讲解性能,于是打算以此博客记录下整个学习的过程,如若有不同意见者可以在下面留言指出,也欢迎大家一起 ...

  10. ES6入门声明

    let.var区别点 1.let只在命令所在的代码块中有效. 2.变量一定要先声明在使用,否则会报错,不存在Es5的变量提升(暂时性死区,不存在重复使用). 3.块级作用域中存在let命令,所声明的变 ...