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模式,对其进行简单的总结,并给出几篇通俗易懂的文章链接. (一)意图--将抽象部分和它的实现部分分离,使它们都可以独立地变化. 适用于从多维度描述的类型,拆解开来,使其能沿着各维度 ...
随机推荐
- optparse模块解析命令行参数的说明及优化
一.关于解析命令行参数的方法 关于“解析命令行参数”的方法我们一般都会用到sys.argv跟optparse模块.关于sys.argv,网上有一篇非常优秀的博客已经介绍的很详细了,大家可以去这里参考: ...
- [UE4]圆形的动态材质,使用VectorParameter、Get Dynamic Material、Set Vector Parameter Value
一.新建一个名为M_FriendColor的材质.使用VectorParameter函数 二.新建一个名为FriendFlag的UserWidget,生成随机颜色,并传递给上一步设置的材质参数Colo ...
- SQL-sqlHelper001
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...
- Linux常用命令1-50(持续更新中)
1:echo $PATH (打印出PATH变量的值) 不同用户下面的PATH值有可能不一样 echo 有显示打印的意思 $ 表示后面的是一个变量的意思 PATH 变量 /usr ...
- zabbix_server.conf配置文件详解
在TTLSA学习zabbix的同学们,来看看zabbix server配置文件参数详细讲解吧.有助于你更了解zabbix.直接往下看. AlertScriptsPath 默认值:/usr/local/ ...
- 家庭版Windows设置远程连接
家庭版Windows设置远程连接1. windows+R 打开运行,输入 regedit 打开注册表 2.依次打开路径 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsof ...
- javascript-关于赋值的那点事
var ary1=[3,4]; var ary2=ary1; ary2[0]=1; ary2=[6,5] console.log(ary1) console.log(ary2) 个人测试出的结果是:更 ...
- Solr——Windows下部署Solr6.6.0至Tomcat8.5.28(二)
1,core理解 如果把solr理解为个数据库的话,那么core可以理解为数据库中的一张表,其实就是数据集合 在写本片文章之前看到网上很多教程都说需要找到solr.xml来配置core的信息,特此说明 ...
- redis参数改进建议
1.修改stop-writes-on-bgsave-error为no当前配置为yes,分别修改redis.conf和当前实例#redis.confstop-writes-on-bgsave-error ...
- LInux下的jdk环境置
1.Linux下使用wget下载jdk8: 进入目录/usr/local/software 2.解压 tar -zxvf jdk-8u152-linux-x64.tar.gz 3.配置环境变量 vi ...