您的位置:首页 > 其它

设计模式之桥接模式

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 桥接模式的优点和缺点

 

优点:

 * 分离抽象接口及其实现部分。

 * 在两个变化的纬度中任意扩展一个纬度,都不需要修改原有的系统。

 

 

缺点:

 * 桥接模式的引入会增加系统的理解与设计的难度。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息