原文: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. hadoop本地运行模式调试

    一:简介 最近学习hadoop本地运行模式,在运行期间遇到一些问题,记录下来备用:以运行hadoop下wordcount为例子. hadoop程序是在集群运行还是在本地运行取决于下面两个参数的设置,第 ...

  2. USB-IF协会公布最新PD3.0(PPS)协议认证芯片和产品名单

    原文: http://www.chongdiantou.com/wp/archives/25510.html 2017年的骁龙技术峰会高通带来了第一款兼容USB PD3.0(PPS)的QC4+充电器, ...

  3. numpy.ravel() vs numpy.flatten()

    首先声明两者所要实现的功能是一致的(将多维数组降为一维),两者的区别在于返回拷贝(copy)还是返回视图(view),numpy.flatten()返回一份拷贝,对拷贝所做的修改不会影响(reflec ...

  4. 更新SAS 9.4(64位) SID的简单方法(可以使用至2018.04.30)

    打开SAS,在程序窗口输入: PROC SETINIT RELEASE='9.4'; SITEINFO NAME='NATIONAL PINGTUNG UNI OF SCIENCE&TECH' ...

  5. windows server 2012 本地用户和组

  6. java下载excel,excel从数据库获取数据

    <!-- poi --> <dependency> <groupId>org.apache.poi</groupId> <artifactId&g ...

  7. 一个windows计划任务的Nginx日志自动截断的批处理命令

    net stop nginx taskkill /im nginx.exe /f cd E:\nginx e: set NO=%Date:~0,4%%Date:~5,2%%Date:~8,2% set ...

  8. 面向对象javascript编程

    以构造函数的方式定义对象 function Person(name, age) { this.name = name; this.age = age; this.sayName = function ...

  9. Docker删除镜像

    docker images往往不知不觉就占满了硬盘空间,为了清理冗余的image,可采用以下方法: 1.进入root权限 sudo su 2.停止所有的container,这样才能够删除其中的imag ...

  10. ZooKeeper Installation(Dev)

    ZooKeeper Installation Install ZooKeeper packages # -jre-headless # sudo apt-get install zookeeper z ...