参考资料 :http://www.jasongj.com/design_pattern/bridge/
http://www.cnblogs.com/houleixx/archive/2008/02/23/1078877.html
一、桥梁模式定义
桥接模式(Bridge Pattern),将抽象部分与它的实现部分分离,使它们都可以独立地变化。更容易理解的表
述是:将一个类变化的部分都抽象出来,单独实现,然后通过依赖注入的方式(set)方式像原有类中添加组合,赋予这个类更多的功
二、使用场景:
一个类如果有多个部分都具有多种可能的变化(该类自身会有不同的行为,它内部引用的对象也具有多种行为),可以抛开类继承的想法,将变化的类都抽象出来,进行组合(依赖注入的方式)。
适用性:
在以下的情况下应当使用桥梁模式:
1.如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。
2.设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。
3.一个类有多于一个存在多种变化的功能,他们之间不存在耦合。
4.虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。
三、例子
比如:汽车的每个部件都有可能发生变换,车档分为手动,自动,半自动模式。车座分为真皮,皮革。车牌更是分为各种类型。如果使用类继承的方式会真对每种品牌的汽车配置的不同档位都建立一个类,即:宝马自动挡,宝马手动挡,宝马半自动,马自达手动,马自达半自动等等。但是如果使用桥连的模式,只需汽车,我们将档位,车牌,等等变化的部分都抽象出来,然后在注入给汽车。这样可以避免对每种车都继承或建立一个类。
四、使用方式
桥连模式角色分为:
1.具体实现角色:主要完成功能的类。相当于主要部件
2.抽象画角色:可以配置到主要功能类中的对象,相当于配件。
将改变的类都抽象出来
配置被主要部件持有(例如通过注入的方式)
主要部件
汽车类:具有多种可能性
package com.jasongj.brand;import com.jasongj.transmission.Transmission;
public abstract class AbstractCar {
protected Transmission gear;
public abstract void run();
public void setTransmission(Transmission gear) {
this.gear = gear;
}
}
package com.jasongj.brand;import org.slf4j.Logger;import org.slf4j.LoggerFactory;
public class BMWCar extends AbstractCar{
private static final Logger LOG = LoggerFactory.getLogger(BMWCar.class);
@Override public void run() {
gear.gear();
LOG.info("BMW is running");
};
}
package com.jasongj.brand;import org.slf4j.Logger;import org.slf4j.LoggerFactory;
public class BenZCar extends AbstractCar{
private static final Logger LOG = LoggerFactory.getLogger(BenZCar.class);
@Override
public void run() {
gear.gear();
LOG.info("BenZCar is running");
};
}
变速档类
分为手动和自动两种变化
package com.jasongj.transmission;
public abstract class Transmission{
public abstract void gear();
}
package com.jasongj.transmission;import org.slf4j.Logger;import org.slf4j.LoggerFactory;
public class Manual extends Transmission {
private static final Logger LOG = LoggerFactory.getLogger(Manual.class);
@Override
public void gear() {
LOG.info("Manual transmission");
}
}
public class Auto extends Transmission {
private static final Logger LOG = LoggerFactory.getLogger(Auto.class);
@Override
public void gear() {
LOG.info("Auto transmission");
}
}
进行桥连
这里通过注入的方式
public static void main(String[] args) {
//第一种车
Transmission auto = new Auto();
AbstractCar bmw = new BMWCar();
bmw.setTransmission(auto);
bmw.run();
//第二种车
Transmission manual = new Manual();
AbstractCar benz = new BenZCar();
benz.setTransmission(manual);
benz.run(); }