一、定义

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

二、角色

抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过聚合关系调用实现化角色中的业务方法。
实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。

三、场景

桥接模式 Bridge Pattern - 图1

类图

image.png

  1. 抽象化(Abstraction)角色 通过聚合关系调用 实现化(Implementor)角色中的业务方法。(这里的UML类图画错了)
  2. 扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过聚合关系调用实现化(Implementor)角色中的业务方法。

代码

实现化(Implementor)角色;

定义实现化角色的接口,供扩展抽象化角色调用

  1. public interface Brand {
  2. void start();
  3. void call();
  4. void stop();
  5. }

抽象化(Abstraction)角色

定义抽象手机.通过聚合的关系把两个不同的对象引入到一起

  1. public abstract class Phone {
  2. // 通过聚合引入
  3. private Brand brand;
  4. public Phone(Brand brand){
  5. this.brand = brand;
  6. }
  7. // 调用实现化(Implementor)角色中的start方法方法
  8. public void start(){
  9. brand.start();
  10. }
  11. public void call(){
  12. brand.call();
  13. }
  14. public void stop(){
  15. brand.stop();
  16. }
  17. }

扩展抽象化(Refined Abstraction)角色

是抽象化角色的子类,实现父类中的业务方法,并通过聚合关系调用实现化(Implementor)角色中的业务方法

  1. public class CurvedScreenPhone extends Phone{
  2. public CurvedScreenPhone(Brand brand) {
  3. super(brand);
  4. }
  5. @Override
  6. public void start() {
  7. System.out.println("曲面屏手机");
  8. super.start();
  9. }
  10. @Override
  11. public void call() {
  12. System.out.println("曲面屏手机");
  13. super.call();
  14. }
  15. @Override
  16. public void stop() {
  17. System.out.println("曲面屏手机");
  18. super.stop();
  19. }
  20. }

水滴屏手机

  1. public class WaterDropScreenPhone extends Phone{
  2. public WaterDropScreenPhone(Brand brand) {
  3. super(brand);
  4. }
  5. @Override
  6. public void start() {
  7. System.out.println("水滴屏手机");
  8. super.start();
  9. }
  10. @Override
  11. public void call() {
  12. System.out.println("水滴屏手机");
  13. super.call();
  14. }
  15. @Override
  16. public void stop() {
  17. System.out.println("水滴屏手机");
  18. super.stop();
  19. }
  20. }

具体实现化(Concrete Implementor)角色

给出实现化角色接口的具体实现;

  1. public class VIVOBrand implements Brand{
  2. @Override
  3. public void start() {
  4. System.out.println("vivo 准备打电话");
  5. }
  6. @Override
  7. public void call() {
  8. System.out.println("vivo 打电话");
  9. }
  10. @Override
  11. public void stop() {
  12. System.out.println("vivo 停止打电话");
  13. }
  14. }

定义华为手机

  1. public class HuaWeiBrand implements Brand{
  2. @Override
  3. public void start() {
  4. System.out.println("华为 准备打电话");
  5. }
  6. @Override
  7. public void call() {
  8. System.out.println("华为 打电话");
  9. }
  10. @Override
  11. public void stop() {
  12. System.out.println("华为 停止打电话");
  13. }
  14. }

客户端代码

  1. public class Client {
  2. public static void main(String[] args) {
  3. Phone waterDropScreenPhone = new WaterDropScreenPhone(new VIVOBrand());
  4. waterDropScreenPhone.start();
  5. waterDropScreenPhone.call();
  6. waterDropScreenPhone.stop();
  7. Phone curvedScreenPhone = new CurvedScreenPhone(new HuaWeiBrand());
  8. curvedScreenPhone.start();
  9. curvedScreenPhone.call();
  10. curvedScreenPhone.stop();
  11. }
  12. }