桥接模式

桥接模式,有些类似排列组合,下面先引用一个非常经典的例子来理解桥接模式。假如某位画画爱好者去买画笔,他需要大、中、小三种型号且具有6种颜色的画笔,如果买彩笔,他需要买3×6=18枝;如果买水彩,他需要3枝笔和6种水彩颜料。如果将它们看做是程序世界里的对象的话,第一种方案需要3×6=18个对象;而第二种方案需要3+6=9个对象。如果增加一种颜色,第一种方案需要增加大、中、小三种型号的画笔,即增加3个对象;而第二种方案只需要增加一种水彩颜料,即增加1个对象,即可完成。为什么会出现这种现象?原因在于第一种方案将颜色和型号两个不同的变化维度耦合在一起,只要其中一个发生变化,就会影响另一个;而第二种方案,将型号与颜色进行分离,使得其中一方改变不能影响另一方,即将型号与颜色进行解耦

 

桥接模式(Bridge Pattern):将抽象部分与其实现部分分离,使它们都可以独立变化。又称为柄体模式(Handle and Body Pattern)接口模式(Interface Pattern)。是一种对象结构型模式

桥接模式通过抽象关联代替传统的多层继承,用动态的对象组合关系取代类之间的静态继承关系,从而更有效的控制了系统中类的个数,使系统更加灵活、易于扩展

 

实现桥接模式,至少要4个角色

抽象类(Abstraction):定义抽象类的接口,一般为抽象类,其中定义了一个实现类接口(Implementor)类型的对象,且与该对象具有关联关系

扩充抽象类(RefinedAbstraction):在系统中可能不止一个,扩充由抽象类(Abstraction)定义的接口。一般情况下不是抽象类而是具体类

实现类接口(Implementor):定义实现类接口

具体实现类(ConcreteImplementor):在系统中可能不止一个,具体实现实现类接口(Implementor)

 

下面代码演示桥接模式

实现类接口 Implementor

package com.design.structural.bridge;

/**
 * 实现类接口
 */
public interface Implementor {

    void operationImpl();
}

定义具体实现类 ConcreteImplementorA

package com.design.structural.bridge;

/**
 * 具体实现类A
 */
public class ConcreteImplementorA implements Implementor{

    @Override
    public void operationImpl() {
        System.out.println("具体实现类A");
    }
}

定义具体实现类 ConcreteImplementorB

package com.design.structural.bridge;

/**
 * 具体实现类B
 */
public class ConcreteImplementorB implements Implementor{

    @Override
    public void operationImpl() {
        System.out.println("具体实现类B");
    }
}

定义抽象类Abstraction

package com.design.structural.bridge;

/**
 * 抽象类
 */
public abstract class Abstraction {

    protected Implementor implementor;

    public Abstraction(Implementor implementor){
        this.implementor = implementor;
    }

    public abstract void operationImpl();
}

扩充抽象类 RefinedAbstractionA

package com.design.structural.bridge;

/**
 * 扩充抽象类A
 */
public class RefinedAbstractionA extends Abstraction{

    public RefinedAbstractionA(Implementor implementor) {
        super(implementor);
    }

    @Override
    public void operationImpl() {
        System.out.println("扩展抽象类A");
        implementor.operationImpl();
    }
}

扩充抽象类 RefinedAbstractionB

package com.design.structural.bridge;

/**
 * 扩充抽象类B
 */
public class RefinedAbstractionB extends Abstraction{

    public RefinedAbstractionB(Implementor implementor) {
        super(implementor);
    }

    @Override
    public void operationImpl() {
        System.out.println("扩展抽象类B");
        implementor.operationImpl();
    }
}

 

类图如下

 

测试调用

package com.design.structural.bridge;

/**
 * 桥接模式
 */
public class TestNMain {

    public static void main(String[] args) {
        RefinedAbstractionA rAA = new RefinedAbstractionA(new ConcreteImplementorA());
        rAA.operationImpl();

        System.out.println(" ");

        RefinedAbstractionA rAB = new RefinedAbstractionA(new ConcreteImplementorB());
        rAB.operationImpl();

        System.out.println(" ");

        RefinedAbstractionB rBA = new RefinedAbstractionB(new ConcreteImplementorA());
        rBA.operationImpl();

        System.out.println(" ");

        RefinedAbstractionB rBB = new RefinedAbstractionB(new ConcreteImplementorB());
        rBB.operationImpl();

    }
}

结果如下图

从结果可以看出实现了扩展抽象类具体实现类的组合,如果其中一方增加需求,只需要继承 Abstraction 抽象类或实现 

Implementor 接口即可

 

 

桥接模式总结

优点:对抽象接口及其实现部分进行分离;提高系统可扩展性;符合开闭原则

缺点:增加对系统的理解和设计难度;要求正确识别出系统中两个独立变化的维度

适用场景:需要在抽象类和具体类之间增加更多灵活性;类中存在多个独立变化的维度,且这些维度都需要独立进行扩展;不希望使用多层继承导致系统类的个数急剧增加

 

 

 

 

  • 8
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟世君子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值