1.桥梁模式 与 策略模式 非常相似

(其实很多设计模式都相似,因为所有的模式都是按照设计原则 而设计出来的,设计原则就相当于武功的心法,设计模式就是招式,只要心法过硬,就可以无招胜有招了。)

这里也有比较详细的说明 策略模式 VS 桥梁模式 (画画,使用蜡笔和使用毛笔以及颜料的区别)

好了,这里先说 桥梁模式,最后再总结两者的区别

2.桥梁模式(还是那样,设计模式就是为了代码健壮,代码重用,所以高内聚,低耦合永远都是那么受欢迎,什么抽象类啊,接口啊···)

场景,农民施肥。

这里农民类 调用 肥料类,用的是组合的方式,也就是农民类中有一个成员属性是肥料类类型的(就是这里起到了桥梁的作用),

为了可扩展性,农民类写成抽象类,肥料类则写成接口;

在施肥这个动作中,不仅肥料的种类会变,而且农民这边也会改变,人工施肥,或者机器施肥等等,所以这里又两个可变因子。

而且这两个可变因子还可以随机组合的,如 人工施 化肥,人工施有机肥;或者 机器人施化肥,机器人施有机肥。

肥料接口 Manure:

1 packagedesign.patterns.bridge2;2 /**

3 * 肥料类4 **/

5 public interfaceManure {6 voidmanuring();7 }

View Code

使用接口的原因很简单,多态嘛

有机肥类,动物肥类 AnimalManure:

1 packagedesign.patterns.bridge2;2

3 public class AnimalManure implementsManure{4

5 @Override6 public voidmanuring() {7 System.out.println("==这是动物肥料,也就是翔····");8 }9

10 }

View Code

化肥类 ChemicalManure:

1 packagedesign.patterns.bridge2;2

3 public class ChemicalManure implementsManure{4

5 @Override6 public voidmanuring() {7 System.out.println("==我是化肥···!");8 }9

10 }

View Code

然后到抽象类 农民类 Farmer:

1 packagedesign.patterns.bridge2;2 /**

3 * 农民类4 **/

5 public abstract classFarmer {6 protectedManure manure;7

8 publicFarmer(Manure manure){9 this.manure =manure;10 }11

12 abstract voiddoManuring();13

14 }

View Code

人类农民 HumanFarmer:

1 packagedesign.patterns.bridge2;2

3 public class HumanFarmer extendsFarmer{4

5 publicHumanFarmer(Manure manure) {6 super(manure);7 }8

9 @Override10 voiddoManuring() {11 System.out.println("我是大农民,我爱劳动");12 manure.manuring();13 }14

15 }

View Code

当科技发达后,可能会有机器人来施肥的 RobotFarmer:

1 packagedesign.patterns.bridge2;2

3 public class RobotFarmer extendsFarmer{4

5 publicRobotFarmer(Manure manure) {6 super(manure);7 }8

9 @Override10 voiddoManuring() {11 System.out.println("机器人也可以施肥的哦。");12 manure.manuring();13 }14

15 }

View Code

最后测试一下 Test类:

1 packagedesign.patterns.bridge2;2

3 public classTest {4 public static voidmain(String[] args){5 //开始施肥6 // //1.准备肥料7 //Manure manure = new AnimalManure();8 //4.突然想施化肥了,

9 Manure manure = newChemicalManure();10 //2.人工施肥,施的是有机肥, 动物肥

11 Farmer farmer = newHumanFarmer(manure);12 // //5.人工施肥,的确较慢,以后会有机器人施肥的13 //Farmer farmer = new RobotFarmer(manure);14

15

16 //3.开工

17 work(farmer);18

19 }20

21 public static voidwork(Farmer farmer){22 farmer.doManuring();23 }24 }

View Code

哎,真的惭愧,感觉我的例子说服力一般,如果理解不了,参考这里桥梁模式(Bridge)(不同平台备分不同格式的log文件)

3.总结:

Strategy(策略模式)是调用者不变,变的只是被调用的方法;(候选模式嘛)

Bridge(桥梁模式)是 调用者和被调用者都可以改变。--可以看成策略模式的加强版(更加一步)

java桥梁模式_java设计模式之桥梁模式(Bridge)相关推荐

  1. java web简单工厂模式_JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

    在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...

  2. java解耦的模板模式_Java 设计模式(9) —— 模板模式

    一.模板模式 封装了一个算法步骤,并允许子类为一个或多个步骤方法提供实现.模板模式可以使子类在不改变算法结构的情况下,重新定义算法中的某些步骤. 模板模式 二.示例 泡咖啡与泡茶: 泡咖啡的步骤: 水 ...

  3. Java创新型模式_java设计模式--创建型模式(一)

    2016-04-24 10:10:34 创建型模式:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式 注意:工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂 ...

  4. 格力电器Java面试题_JAVA设计模式学习--工厂模式

    今天谈一下对工厂模式学习的总结. 看完视频和文章之后要自己表述工厂模式,总是感觉无从说起,不知道怎么去定义工厂模式,反复看了几遍之后终于理解一点. 自己理解工厂模式是通过这两种模式的特点来理解和定义的 ...

  5. java 工厂方法_java设计模式-工厂方法模式

    1.工厂方法(FactoryMethod)模式的定义 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中.这满足创建型模式中所要求的"创建与使用相分离" ...

  6. java策略模式_Java设计模式之策略模式详解

    本文实例为大家分享了Java策略模式,供大家参考,具体内容如下 1.策略模式(Strategy Pattern)是一种比较简单的模式,也叫做政策模式(PolicyPattern). 定义如下: Def ...

  7. java抽象工厂模式_JAVA设计模式-抽象工厂模式

    定义 抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构. 抽象工厂模 ...

  8. java外观设计修改_Java设计模式之外观模式和装饰器模式的设计(精选)

    前言 本篇来学习下结构型模式的外观模式和装饰器模式. 外观模式 简介 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接 ...

  9. java模板方法模式_java设计模式(模板方法模式)

    模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.通俗的说的就是有很多相同的步骤的,在某一些地方可能有一些差 ...

  10. java 模板模式_java设计模式之模板模式

    模板模式 模板模式(Template Pattern),定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构,只是重定义该算法的某些特定步骤.这种类型的设计模式属于 ...

最新文章

  1. 作业盒子完成1.5亿美元D轮融资,更名“小盒科技”
  2. 集团年终总结的几点体会
  3. Linux:echo、read、cat命令
  4. mfc连接ubuntu mysql数据库_Ubuntu 16.04 Linux系统下使用C++连接mysql数据库
  5. 谷歌发布企业版TensorFlow,或提供收费服务?
  6. mysql的varchar最大值是多少_MySQL varchar计算:求列的数额和计算N的最大值
  7. ios退款 怎么定位到是哪个用户_哪个浏览器兼容性最好用?看看用户都是怎么评价的吧...
  8. erlang四大behaviour简述
  9. 7620a路由mysql_MT7620A路由刷DDWRT 及2.4G无线设置经验
  10. 微信小程序(一) 入门
  11. Material Design学习之 Dialog(顺便把前两天AppBarLayout没讲的部分提一提)
  12. Springboot集成通用Mapper与Pagehelper,实现mybatis+Druid的多数据源配置
  13. 拖动获取元素_如何使用HTML5实现多个元素的拖放功能
  14. 报错Failed to load config “prettier“ to extend from.?两步解决方案
  15. linux下分析prn文件,Linux文件的管理
  16. glide加载gif图不显示动画_Glide 加载gif的一些个人总结
  17. 黑金AX7Z100 FPGA开发板移植LWIP库(二)PL端
  18. 素数判断和大合数分解_素数合数分解公式与原理 质数秘密已解开
  19. 使用Linux搭建IPV6路由器
  20. 不知道买啥绘本?适合3-6岁儿童的绘本书单,建议父母收藏

热门文章

  1. Python的安装与配置
  2. Tinker的简单接入
  3. python 命名风格_python 代码风格------------PEP8规则
  4. 事务失败返回_分布式事务有这一篇就够了!
  5. Thinkphp报错:fields not exists:[status]
  6. Shell 把日志记录按天切割到不同的文件
  7. python 显示表格数据匹配_比较两个电子表格文件并提取机器匹配数据的最简单和最快的方法是什么?...
  8. 全网首发:LINUX(UOS)对GTK/X11的窗口的差异
  9. 有效解决办法:marven:Fatal error compiling: 无效的目标发行版: 11
  10. asm.jar各版本下载网站