将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。

    【使用场景】

    • 一个系统需要在构建的抽象化角色和具体化角色间增加更多灵活性,避免在两个层次间建立静态继承关系,可以通过桥接模式使他们在抽象层建立一个关联关系。
    • 一个类存在两个独立变化的维度,且两个维度都需要扩展。
    • 对于不希望使用继承或因多层次继承导致系统类的个数急剧增加的系统,也可使用桥接模式。

      1. /**
      2. * 品牌
      3. */
      4. public interface Brand {
      5. String explain();
      6. }
      1. /**
      2. * vivo品牌
      3. */
      4. public class VivoBrand implements Brand {
      5. @Override
      6. public String explain() {
      7. return "vivo";
      8. }
      9. }
      1. /**
      2. * 小米品牌
      3. */
      4. public class XiaoMiBrand implements Brand {
      5. @Override
      6. public String explain() {
      7. return "小米";
      8. }
      9. }
      1. /**
      2. * 手机
      3. */
      4. public abstract class Phone {
      5. /**
      6. * 品牌
      7. */
      8. protected Brand brand;
      9. public Phone(Brand brand) {
      10. this.brand = brand;
      11. }
      12. abstract void call();
      13. }
      1. /**
      2. * 折叠手机
      3. */
      4. public class FoldPhone extends Phone {
      5. public FoldPhone(Brand brand) {
      6. super(brand);
      7. }
      8. @Override
      9. public void call() {
      10. System.out.println(brand.explain() + "折叠手机打电话");
      11. }
      12. }
      1. /**
      2. * 滑盖手机
      3. */
      4. public class SlidePhone extends Phone {
      5. public SlidePhone(Brand brand) {
      6. super(brand);
      7. }
      8. @Override
      9. public void call() {
      10. System.out.println(brand.explain() + "滑盖手机打电话");
      11. }
      12. }
      1. public class BridgeTest {
      2. public static void main(String[] args) {
      3. // 小米折叠手机
      4. Phone xiaoMiFoldPhone = new FoldPhone(new XiaoMiBrand());
      5. xiaoMiFoldPhone.call();
      6. // 小米滑盖手机
      7. Phone xiaoMiSlidePhone = new SlidePhone(new XiaoMiBrand());
      8. xiaoMiSlidePhone.call();
      9. // vivo折叠手机
      10. Phone vivoFoldPhone = new FoldPhone(new VivoBrand());
      11. vivoFoldPhone.call();
      12. // vivo滑盖手机
      13. Phone vivoSlidePhone = new SlidePhone(new VivoBrand());
      14. vivoSlidePhone.call();
      15. }
      16. }
      17. ----输出----
      18. 小米折叠手机打电话
      19. 小米滑盖手机打电话
      20. vivo折叠手机打电话
      21. vivo滑盖手机打电话