原文: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. OpenSips使用说明

    OpenSips使用说明 安装MYSQL 安装及初始化 下载地址:http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.17-linux-gli ...

  2. Android定位服务关闭和定位(悬浮)等权限拒绝的判断

    public void checkLocationPermission() { if (!PermissionHelper.isLocServiceEnable(this)) {//检测是否开启定位服 ...

  3. 使用fakeroot模拟root权限执行程序(转)

    Hack #57: 使用fakeroot模拟root权限执行程序 fakeroot是什么 例如Debian在生成package的时候,编译完之后,不能立刻在当前环境执行make install,需要执 ...

  4. virtual box + win7 + usb + share folder

    1.enable virtaulization on BIOS 2.new machine setup, memory, harddisk size 3. 4.install extension pa ...

  5. selenium在scrapy中的应用

    引入 在通过scrapy框架进行某些网站数据爬取的时候,往往会碰到页面动态数据加载的情况发生,如果直接使用scrapy对其url发请求,是绝对获取不到那部分动态加载出来的数据值.但是通过观察我们会发现 ...

  6. JS+Ajax+Servlet:记录页面访问时间

    1.前端JS记录页面访问时间 1.1JQuery版本: <script type="text/javascript" src="js/jquery.min.js&q ...

  7. SpringBoot 实现前后端分离的跨域访问(CORS)

    序言:跨域资源共享向来都是热门的需求,使用CORS可以帮助我们快速实现跨域访问,只需在服务端进行授权即可,无需在前端添加额外设置,比传统的JSONP跨域更安全和便捷. 一.基本介绍 简单来说,CORS ...

  8. mysql给查询的结果添加序号

    1.法一: select  (@i:=@i+1)  i,a.url from  base_api_resources a  ,(select   @i:=0)  t2 order by a.id de ...

  9. Matplotlib模块

    不求甚解,不断学习不断添加... 2017.10.26 1.绘制简单的图像 # 第一步创建显示画面,figure('show')指定图表名称 plt.figure('data') #绘制图像--> ...

  10. Jquery在表格中搜索关键字

    <!DOCTYPE html><html><head> <title>ddd</title></head><body> ...