桥接模式

如若要实现下图关系我们首先可以使用多继承的方式
桥接模式

未使用桥接模式
桥接模式
很麻烦(部分实现代码如下)

package pattern.bridge;
//电脑
public interface Computer {
    void sale();
}

package pattern.bridge;

public class Desktop implements Computer {
    @Override
    public void sale() {
        System.out.println("销售台式机!");
    }
}

package pattern.bridge;

public class Laptop implements Computer {
    @Override
    public void sale() {
        System.out.println("销售笔记本!");
    }
}

package pattern.bridge;

public class Pad implements Computer{
    @Override
    public void sale() {
        System.out.println("销售平板电脑!");
    }
}

package pattern.bridge;

public class LenovoDesktop extends Desktop {
    @Override
    public void sale() {
        System.out.println("销售联想台式机");
    }
}

package pattern.bridge;

public class LenovoLaptop extends Laptop {
    @Override
    public void sale() {
        System.out.println("销售联想笔记本");
    }
}

package pattern.bridge;

public class LenovoPad extends Pad {
    @Override
    public void sale() {
        System.out.println("销售联想平板电脑");
    }
}

存在很多问题

  1. 扩展性问题(类个数膨胀问题):
  • 如果要增加一个新的电脑类型:智能手机,则要增加各个品牌下的类。
  • 如果要增加一个新的品牌,也要增加各种电脑类型的类。
  1. 违反单一指责原则:
  • 一个类:联想笔记本,有两个引起这个类变化的原因。

使用桥接模式
核心要点:处理多层继承结构,处理多维度变化的场景,将各个维度设计成独立的继承结构,使各个维度可以独立的扩展正在抽象层建立关系。

建立品牌

package pattern.bridge;

/**
 * 品牌
 */
public interface Brand {
    void sale();
}

package pattern.bridge;

public class Dell implements Brand {
    @Override
    public void sale() {
        System.out.println("销售戴尔电脑!");
    }
}

package pattern.bridge;

public class Lenvovo implements Brand {
    @Override
    public void sale() {
        System.out.println("销售联想电脑!");
    }
}

建立电脑类型

package pattern.bridge;

/**
 * 电脑类型
 */
public class Computer {

    protected Brand brand;

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

    public void sale(){
        brand.sale();
    }
}

package pattern.bridge;

public class Desktop extends Computer {

    public Desktop(Brand brand) {
        super(brand);
    }

    @Override
    public void sale() {
        super.sale();
        System.out.println("销售笔记本");
    }
}

package pattern.bridge;

public class Laptop extends Computer {

    public Laptop(Brand brand) {
        super(brand);
    }

    @Override
    public void sale() {
        super.sale();
        System.out.println("销售台式机");
    }
}

测试调用

package pattern.bridge;

public class Client {
    public static void main(String[] args) {
        //销售联想笔记本
        Computer computer=new Laptop(new Lenvovo());
        computer.sale();
    }
}

结果

销售联想电脑!
销售台式机

如果想增加新的类型或品牌可以直接新加一个类继承相对应的接口,非常的方便。
桥接模式