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

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

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

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

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

场景,农民施肥。

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

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

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

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

肥料接口 Manure:

 package design.patterns.bridge2;
/**
* 肥料类
* */
public interface Manure {
void manuring();
}

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

有机肥类,动物肥类 AnimalManure:

 package design.patterns.bridge2;

 public class AnimalManure implements Manure{

     @Override
public void manuring() {
System.out.println("==这是动物肥料,也就是翔····");
} }

化肥类 ChemicalManure:

 package design.patterns.bridge2;

 public class ChemicalManure implements Manure{

     @Override
public void manuring() {
System.out.println("==我是化肥···!");
} }

然后到抽象类 农民类 Farmer:

 package design.patterns.bridge2;
/**
* 农民类
* */
public abstract class Farmer {
protected Manure manure; public Farmer(Manure manure){
this.manure = manure;
} abstract void doManuring(); }

人类农民 HumanFarmer:

 package design.patterns.bridge2;

 public class HumanFarmer extends Farmer{

     public HumanFarmer(Manure manure) {
super(manure);
} @Override
void doManuring() {
System.out.println("我是大农民,我爱劳动");
manure.manuring();
} }

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

 package design.patterns.bridge2;

 public class RobotFarmer extends Farmer{

     public RobotFarmer(Manure manure) {
super(manure);
} @Override
void doManuring() {
System.out.println("机器人也可以施肥的哦。");
manure.manuring();
} }

最后测试一下 Test类:

 package design.patterns.bridge2;

 public class Test {
public static void main(String[] args){
//开始施肥
// //1.准备肥料
// Manure manure = new AnimalManure();
//4.突然想施化肥了,
Manure manure = new ChemicalManure();
//2.人工施肥,施的是有机肥, 动物肥
Farmer farmer = new HumanFarmer(manure);
// //5.人工施肥,的确较慢,以后会有机器人施肥的
// Farmer farmer = new RobotFarmer(manure); //3.开工
work(farmer); } public static void work(Farmer farmer){
farmer.doManuring();
}
}

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

3.总结:

Strategy(策略模式)是调用者不变,变的只是被调用的方法;(候选模式嘛)
   Bridge(桥梁模式)是 调用者和被调用者都可以改变。--可以看成策略模式的加强版(更加一步)

java设计模式之桥梁模式(Bridge)的更多相关文章

  1. JAVA设计模式之桥梁模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述桥梁(Bridge)模式的: 桥梁模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式. ...

  2. java 设计模式 之 桥梁模式

    桥梁模式:将抽象和实现解耦,使两者可以独立的变化.解释:将两个有组合关系,强耦合的对象,各自抽象然后解耦.(类关系图看https://www.cnblogs.com/blogxiao/p/951388 ...

  3. 桥接模式 桥梁模式 bridge 结构型 设计模式(十二)

      桥接模式Bridge   Bridge 意为桥梁,桥接模式的作用就像桥梁一样,用于把两件事物连接起来   意图 将抽象部分与他的实现部分进行分离,使得他们都可以独立的发展.  意图解析 依赖倒置原 ...

  4. Java设计模式——装饰者模式

    JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...

  5. 浅析JAVA设计模式之工厂模式(一)

    1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...

  6. 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)

    原文:乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) 作者:webabcd 介绍 ...

  7. JAVA设计模式--装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...

  8. 折腾Java设计模式之建造者模式

    博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...

  9. 折腾Java设计模式之备忘录模式

    原文地址:折腾Java设计模式之备忘录模式 备忘录模式 Without violating encapsulation, capture and externalize an object's int ...

随机推荐

  1. 从源代码分析DbSet如何通过ObjectStateManager管理entity lifecycle的生命周期

    一:Savechange的时候,怎么知道哪些entity被add,modify,delete,unchange ???? 如何来辨别... 在entity中打上标记来做表示...已经被跟踪了...当每 ...

  2. .net 程序集的加载与反射

    一. 程序集的加载: 在CLR内部使用System.Reflection.Assembly类的静态LoadFrom方法尝试加载程序集. LoadFrom方法在内部调用Assembly的Load方法,将 ...

  3. [LeetCode 题解]: Generate Parentheses

    Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...

  4. django model项目外操作

    方法1: python manage.py shell 然后import对应的model并操作 方法2: 新建py脚本 import sys import os pwd = os.path.dirna ...

  5. c# 变量交换

    C#  变量交换 变量交换的方法: 1.借助第三个变量: class Program { static void Main(string[] args) { Exchage(,); } /// < ...

  6. 清北学堂(2019 4 30 ) part 3

    今天总的讲些算法,会了的话...看上去好厉害的样子: 1.老朋友动态规划DP: DP重点: 1.边界条件,开头不需处理的数据,比如斐波那契数列中的第一二项 2.转移方程,后面的项需要根据前面几项求出自 ...

  7. 新编辑器Cocos Creator发布:对不起我来晚了!

    1月19日,由Cocos创始人王哲亲手撰写的一篇Cocos Creator新品发布稿件在朋友圈被行业人士疯狂转载,短短数小时阅读量突破五位数.Cocos Creator被誉为“注定将揭开Cocos开发 ...

  8. linux命令之系统管理命令(下)

    1.chkconfig:管理开机服务 该命令为linux系统中的系统服务管理工具,可以查询和更新不同的运行等级下系统服务的启动状态. 选项 说明 --list(常用) 显示不同运行级别下服务的启动状态 ...

  9. leecode刷题(12)-- 整数反转

    leecode刷题(12)-- 整数反转 整数反转 描述: 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: - ...

  10. [ActionScript 3.0] 用TextField的方法getCharIndexAtPoint(x:Number, y:Number):int实现文字在固定范围内显示

    有时候我们遇到一行文字过多时必须固定文字的显示范围,但由于中英文所占字节数不一样,所以不能很好的用截取字符的方式去统一显示范围的大小,用TextField的getCharIndexAtPoint(x: ...