java 实现Bridge模式(转)
原文: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模式(转)的更多相关文章
- 设计模式(java)--Bridge模式之蜡笔与毛笔的故事
转自:吕震宇 http://www.cnblogs.com/zhenyulu/articles/67016.html#!comments 我想大家小时候都有用蜡笔画画的经历吧.红红绿绿的蜡笔一大盒,根 ...
- Java设计模式(6)桥模式(Bridge模式)
Bridge定义:将抽象和行为划分开来,各自独立,但能动态的结合. 为什么使用桥模式 通常,当一个抽象类或接口有多个具体实现(concrete subclass),这些concrete之间关系可能有以 ...
- Java 实现桥接(Bridge)模式
类图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamp3d21scDQ1Ng==/font/5a6L5L2T/fontsize/400/fill/I0 ...
- 设计模式之桥接模式(Bridge模式)
我想大家小时候都有用蜡笔画画的经历吧.红红绿绿的蜡笔一大盒,根据想象描绘出格式图样.而毛笔下的国画更是工笔写意,各展风采.而今天我们的故事从蜡笔与毛笔说起. 设想要绘制一幅图画,蓝天.白云.绿树.小鸟 ...
- 设计模式初探-桥接(Bridge)模式
桥接(Bridge)模式,又称Handle/Body模式,属于对象结构型模式.用于将抽象部分与它的实现部分分离,使它们都可以独立地变化.比如常见的电脑窗口界面,不同的操作系统其窗口界面绘制的原理肯定不 ...
- Android中Adapter和Bridge模式理解和应用
一 Adapter模式 意图: 将一个类的接口转换成客户希望的另外一个接口. Adapter模式使得原本由于接口不兼容而不能在一起工作的那些类可以在一起工作. 适用性: 使用一个已存在的类,而它的接口 ...
- 设计模式(7)-结构型模式-Bridge模式
2.结构性模式 2.2 BRIDGE模式 别名:handle/body 这个模式体现了组合相对于继承的优势. 2.2.1动机 当一个抽象可能有多个实现时,通经常使用继承来协调它们.抽象类定义对该抽象 ...
- 【设计模式】Java设计模式 - 桥接模式
[设计模式]Java设计模式 - 桥接模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起 ...
- Bridge模式——对象结构型模式
今天看了Bridge模式,对其进行简单的总结,并给出几篇通俗易懂的文章链接. (一)意图--将抽象部分和它的实现部分分离,使它们都可以独立地变化. 适用于从多维度描述的类型,拆解开来,使其能沿着各维度 ...
随机推荐
- vue todolist待办事项完整
<template> <div id="app"> <input type="text" v-model='todo' @keyd ...
- [UE4]C++代码实现播放粒子特效
转自:http://aigo.iteye.com/blog/2273345 函数参数说明(在GameplayStatics.h中) 将一个粒子放到指定位置上播放: 另一种重载形式: 将一个粒子atta ...
- 如何使用Python操纵Postgres数据库
pip install psycopg2 psycopg2-binary #!/usr/bin/python import psycopg2conn = psycopg2.connect(databa ...
- linux 安装scala
1. 下载scala 到scala官网下载scala https://www.scala-lang.org/download/,目前最新版本是2.12.8 wget https://downloads ...
- Select模式和超时
fd_set rset; FD_ZERO(&rset); int nready; int maxfd; int fd_stdin = fileno(stdin); if(fd_stdin &g ...
- 【CF1132F】Clear the String (DP)
/* 区间dp题目, 考虑当前区间l,r 是可以枚举最后一次拿的分界点来考虑最右边节点是不是具有贡献 */ #include<cstdio> #include<algorithm&g ...
- Mac下如何用SSH连接远程Linux服务器,centos无法复制粘贴
CentOS 7.1安装完之后默认已经启动了ssh服务我们可以通过以下命令来查看ssh服务是否启动. 3.2查看22端口是否开放 #netstat -tnl 3.3查看ssh服务是否启动 #syste ...
- jquery双击事件会触发单击事件
实际工作中,我们经常会遇到在同一个元素上,绑定多种事件类型,比较常见的是单击事件和一些鼠标事件,一般而言影响不大.但是如果同时绑定单击事件和双击事件呢? 其实,只要能够想明白的话,解决方案也比较简单, ...
- Eclipse svn 项目 星号
上图: 明明没有文件修改过就是无脑显示有提交的文件,有强迫症受不了. 而且每次提交你都点开看有没有漏掉啥文件.很麻烦.也很难受 .很容易漏提交 把本地文件跟SVN同步对比一下. 果然有文件. 添加规则 ...
- 安装VMTools工具
1)什么是VMtools VM tools顾名思义就是Vmware的一组工具.主要用于虚拟主机显示优化与调整,另外还可以方便虚拟主机与本机的交互,如允许共享文件夹,甚至可以直接从本机向虚拟主机拖放文件 ...