设计模式(8)-- 桥接

1. 写在前面

上一小节中我们学习了 适配器 Adapter,其主要的应用场景是将一类对象转换成为另一类对象。
这里转换的过程分为3步:

  • 接受原对象
  • 实现原对象的逻辑
  • 返回目标对象

2. 桥接 Bridge

桥接Bridge Pattern 的特点是把抽象(abstraction)与行为实现(implementation)分离开来,从而可以保持各部分的独立性以及应对它们的功能扩展。
这个概念还是非常抽象的,其主要应用在如下场景:

多维度变化,多层继承结构
我们将每一个维度进行独立封装,使得各个维度可以独立扩展。避免直接继承带来的子类爆炸。


3. 使用

使用场景:一个类在 2个维度 都会变化

记住这是桥接使用的唯一场景。

我们看一个电脑的例子,在传统的继承结构中我们会如下安排整体的结构。


按照传统的继承结构,我们会产生3个级别, 4 个子类。

但是如果我们按照维度来封装,即 Brand & Type

直接看代码

首先是对第一个维度 Brand 的封装,将其封装为一个接口。

//  品牌维度
public Interface Brand(){
      // 品牌维度的信息
      void  brandInfo();
}

public class AppleBrand implements Brand{
    @Override
    void brandInfo(){
        sout("Apple Brand !")
    }
}

public class AsusBrand implements Brand{
    @Override
    void brandInfo(){
        sout("Asus Brand !")
    }  
}

然后是第二个维度的封装,因为最终我们需要包含2个维度的信息,因此需要使用一个 抽象类持有第一个维度的引用,同时在 这个抽象类中的抽象方法中,写入第二个维度信息。

// 类型维度
//  这里因为类型是要包含品牌在内的,因此需要持有品牌的接口
public abstract class Computer(){
      protected Brand brand;

      void Computer(Brand brand){
            this.brand = brand;
      }

      // 这个抽象接口是要实现2个维度的逻辑的
      public abstract info();
}


// 具体的类型
public Laptop extends Computer{
      void Laptop(Brand brand){
          super(brand);
      }

      @Override 
      public void info(){
          // Brand 维度的信息
          brand.info();
          // Type 维度的信息
          sout("this is laotop !")
      }
}


public class Desktop extends Computer{
    public Desktop(Brand brand) {
        super(brand);
    }

    @Override
    public void info() {
        // Brand 维度信息
        brand.info();
        // Type 维度信息
        System.out.println("this is desktop");
    }
}

现在到了具体的使用了。
可以看到两个维度可以灵活组合。

       MacBrand macBrand = new MacBrand();
        AsusBrand asusBrand = new AsusBrand();

        Desktop macDesktop = new Desktop(macBrand);
        macDesktop.info();
        Desktop asusDesktop = new Desktop(asusBrand);
        asusDesktop.info();


        Laptop macLaptop = new Laptop(macBrand);
        macLaptop.info();
        Laptop asusLaptop = new Laptop(asusBrand);
        asusLaptop.info();

下面是输出

this is Mac Brand!
this is desktop
This is Asus brand!
this is desktop
this is Mac Brand!
this is laptop!
This is Asus brand!
this is laptop!

你可能感兴趣的:(设计模式(8)-- 桥接)