设计模式之桥接模式
2016-07-27 10:11
218 查看
转载至 http://blog.csdn.net/qq_35064774/article/details/52042844
1 什么是桥接模式
将抽象化与实现化脱耦,使得两者可以独立的演化。举个简单的例子。
物品从感性上划分可分为可爱的、冷酷的、热情的等,从性质上划分可分为各类物品,比如:花、草、树、鸟等。
这样就出现了排列组合的问题,花可以有可爱的、冷酷的、热情的,同样其他性质的物品也是。
如果给每个这样的组合都做一个类,工作量就太大了。这时就需要引入桥接模式。
2 桥接的实现
桥接的主要原理是把两个维度上的扩展分开,也就是解耦合。
同样先引入一个简单的小问题。
* 空中巴士(Airbus)、波音(Boeing)和麦道(MD)都是飞机制造厂商。
* 它们都生产客机和货机。
* 先要求描述飞机的类型和生产厂商
面对这样一个问题,首先应该是抽象出一个飞机类,这个飞机类需要从作用和厂商两个维度来扩展,这时候就需要用到桥接的思想。也就是把其中一个维度单独抽象出来成为一个类或接口,这里我们把飞机厂商抽象出来。
package com.ittianyu.bridge; public abstract class PlaneMaker { public abstract String getMaker(); }
package com.ittianyu.bridge; public abstract class Plane { protected PlaneMaker maker; public Plane(PlaneMaker maker) { this.maker = maker; } public abstract void fly(); }
为了知道飞机的生产商,我们就在飞机类里保存一个生产商的对象。
接下来就是具体的实现类。
飞机有客机和货机。
package com.ittianyu.bridge; public class PassengerPlane extends Plane { public PassengerPlane(PlaneMaker maker) { super(maker); } @Override public void fly() { System.out.println("passenger plane created by " + maker.getMaker()); } }
package com.ittianyu.bridge; public class CargoPlane extends Plane { public CargoPlane(PlaneMaker maker) { super(maker); } @Override public void fly() { System.out.println("cargo plane created by " + maker.getMaker()); } }
而生产商有巴士(Airbus)、波音(Boeing)和麦道(MD)
package com.ittianyu.bridge; public class AirbusPlaneMaker extends PlaneMaker { @Override public String getMaker() { return "Airbus"; } }
package com.ittianyu.bridge; public class BoeingPlaneMaker extends PlaneMaker { @Override public String getMaker() { return "Boeing"; } }
package com.ittianyu.bridge; public class MDPlaneMaker extends PlaneMaker { @Override public String getMaker() { return "MD"; } }
最后是测试类
package com.ittianyu.bridge; public class Test { public static void main(String[] args) { Plane plane1 = new PassengerPlane(new AirbusPlaneMaker()); plane1.fly(); Plane plane2 = new PassengerPlane(new BoeingPlaneMaker()); plane2.fly(); Plane plane3 = new CargoPlane(new AirbusPlaneMaker()); plane3.fly(); Plane plane4 = new PassengerPlane(new MDPlaneMaker()); plane4.fly(); Plane plane5 = new CargoPlane(new MDPlaneMaker()); plane5.fly(); } }
3 在什么情况下使用桥接模式
* 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。
* 设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。
* 一个构件有多于一个的抽象化角色和实现化角色,系统需要它们之间进行动态耦合。
* 抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。
4 桥接模式的优点和缺点
优点:
* 分离抽象接口及其实现部分。
* 在两个变化的纬度中任意扩展一个纬度,都不需要修改原有的系统。
缺点:
* 桥接模式的引入会增加系统的理解与设计的难度。
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- 设计模式---状态模式在web前端中的应用
- Ruby设计模式编程之适配器模式实战攻略
- 实例讲解Ruby使用设计模式中的装饰器模式的方法
- 设计模式中的模板方法模式在Ruby中的应用实例两则
- Ruby设计模式编程中对外观模式的应用实例分析
- 实例解析Ruby设计模式编程中Strategy策略模式的使用
- Ruby中使用设计模式中的简单工厂模式和工厂方法模式
- Ruby使用设计模式中的代理模式与装饰模式的代码实例
- 详解组合模式的结构及其在Ruby设计模式编程中的运用
- C# 设计模式系列教程-建造者模式
- C#编程中使用设计模式中的原型模式的实例讲解
- 使用设计模式中的工厂方法模式进行C#编程的示例讲解
- 实例解析C#设计模式编程中简单工厂模式的使用