桥模式

桥模式

2020-10-20
设计模式
  • 模式定义:将抽象与实现分离,使它们都可以独立地变化。
  • 应用场景:两个非常强的变化维度。

案例 #

场景

  1. 分析一下,首先会创建1个电脑类,然后创建3个电脑的子类(即电脑的类型),再创建3x3个子类。假设有n种电脑类型,m种电脑品牌,那么产生的类的数量为1+n+nxm

  2. 如果再加一个电脑品牌acer,则需要再添加三个类,即acer台式机、acer笔记本、acer平板。显然这种方式产生的类的数量非常多。

  3. 此外,这个实现违背了单一职责原则,类中出现了两个变化(电脑类型和品牌)。

  4. 解决办法:将类型写成一个抽象类,将品牌写成一个抽象类。通过一个"桥"将他们联系起来。

//品牌类
interface Brand{
    void info();
}
class Lenovo implements Brand{
    public void info(){
        //...
    }
}
class Apple implements Brand{
    public void info(){
        //...
    }
}
class Dell implements Brand{
    public void info(){
        //...
    }
}

//电脑类
abstract class Computer{
    //通过类组合来替代类继承
    protected Brand brand;
    
    public Computer(Brand brand){this.brand=brand;}
    
    abstract void info();
}

class Desktop extends Computer{
    public Desktop(Brand brand){super(brand);}
    public void info(){
        //...
    }
}

class Laptop extends Computer{
    public Laptop(Brand brand){super(brand);}
    public void info(){
        //...
    }
}
class Pad extends Computer{
    public Pad(Brand brand){super(brand);}
    public void info(){
        //...
    }
}
  1. 通过上面的修改,类的数量变成了1+n+m
  2. 在这里我理解的抽象是Brand,实现指的是Computer和Computer的子类。