桥接模式:将抽象的部分与它的实现部分分离,使它们都可以独立地变化。
什么叫抽像与实现分离,并不是说让抽象类与其派生类分离,因为这没有任何意义,实现指的是抽象类和它的派生类用来实现自己的对象。以手机来举例子,手机有多个品牌的牌子,也有很多个功能,可以根据手机牌子分类,又可以以功能来分类,实现方式的多种,可以让它们独立出来,让它们独立地变化,使得每种变化,不会影响其他实现,达到应对变化的目的。其实也就是实现系统的可能有多种维度,每一个维度都有可能变化,那么就把这种多维度分离出来,让其独立地变化,减少它们之间的耦合。
Abstraction
package bridge;
/**
* Created by canon on 2019/1/11.
* 抽象
*/
public class AbstractMobile {
protected MobileImplementor mobileImplementor;
public void setMobileImplementor(MobileImplementor mobileImplementor) {
this.mobileImplementor = mobileImplementor;
}
void operation(){
mobileImplementor.operation();
}
}
RefinedAbstraction
package bridge;
/**
* Created by canon on 2019/1/11.
*/
public class ContreteAbstractMobile extends AbstractMobile{
@Override
void operation() {
this.mobileImplementor.operation();
}
}
Implementor
package bridge;
/**
* Created by canon on 2019/1/11.
*/
public abstract class MobileImplementor {
abstract void operation();
}
ContreteImplementor
package bridge;
/**
* Created by canon on 2019/1/11.
*/
public class ContreteMobileImplementorApple extends MobileImplementor{
@Override
void operation() {
System.out.println("开始我的苹果之旅");
}
}
package bridge;
/**
* Created by canon on 2019/1/11.
*/
public class ContreteMobileImplementorOnePlus extends MobileImplementor{
@Override
void operation() {
System.out.println("开启我的一加之旅");
}
}
客户端调用
package bridge;
/**
* Created by canon on 2019/1/11.
*/
public class Controller {
public static void main(String[] args) {
AbstractMobile abstractMobile = new AbstractMobile();
abstractMobile.setMobileImplementor(new ContreteMobileImplementorApple());
abstractMobile.operation();
abstractMobile.setMobileImplementor(new ContreteMobileImplementorOnePlus());
abstractMobile.operation();
}
}
开始我的苹果之旅
开启我的一加之旅
Process finished with exit code 0
桥接模式使得品牌以及软件的变化独立出来,使得每一个变化都不会影响到别的变化,如同书中所说,如果每个手机有自己专属的软件,或者游戏,然后手机有多种,也就是多种手机,多种专属的游戏。我们在使用面向对象实现的时候,如果有一个手机父类,那么子类就是对应的手机类型,然后每个手机类型里面都有属于自己游戏以及其他专属软件。如下图
那么当一个手机多了个专属的软件,那么就得改写原来的手机子类,当类型越来越多的时候,增加的就会越来越麻烦,这个时候,多个维度的变化,使得继承在这个时候,使用起来就没有使用组合的方式来的舒服。
优点: 1、抽象和实现的分离。 2、优秀的扩展能力。 3、实现细节对客户透明。
缺点:桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
使用场景: 1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。 2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。 3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。