原创

设计模式-桥接模式

桥接模式基本介绍:

  1. 桥接模式是指将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变。
  2. 是一种结构型设计模式。
  3. Bridge模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展。

传统模式解决手机问题-分析

现在对不同手机类型的不同品牌实现操作编程(比如: 开机、关机、上网,打电话等)

使用传统方法对应的类图-手机操作问题.png

传统方法解决手机问题:

  1. 扩展性问题(类爆炸),如果我们再增加手机的样式(旋转式),就需要增加各个品牌手机的类,同样如果我们增加一个手机品牌,也要在各个手机样式类下增加。
  2. 违反了单一职责原则,当我们增加手机样式时,要同时增加所有品牌的手机,这样增加了代码维护成本。

桥接模式解决手机问题-Demo

接口Brand定义开机、关机、打电话的三个接口方法:

/**
 * 接口
 *
 * @author lzhpo
 */
public interface Brand {
    void open();
    void close();
    void call();
}

小米手机XiaoMi实现Brand接口的三个方法:

public class XiaoMi implements Brand{
    @Override
    public void open() {
        System.out.println("小米手机开机...");
    }

    @Override
    public void close() {
        System.out.println("小米手机关机...");
    }

    @Override
    public void call() {
        System.out.println("小米手机打电话...");
    }
}

同理,Vivo手机也一样:

public class Vivo implements Brand{
    @Override
    public void open() {
        System.out.println("Vivo手机开机...");
    }

    @Override
    public void close() {
        System.out.println("Vivo手机关机...");
    }

    @Override
    public void call() {
        System.out.println("Vivo手机打电话...");
    }
}

手机抽象类Phone:

public abstract class Phone {
    // 组合品牌
    private Brand brand;

    public Phone(Brand brand) {
        super();
        this.brand = brand;
    }

    protected void open() {
        this.brand.open();
    }

    protected void close() {
        this.brand.close();
    }

    protected void call() {
        this.brand.call();
    }
}

直立手机类,继承抽象类Phone:

public class UpRightPhone extends Phone {
    public UpRightPhone(Brand brand) {
        super(brand);
    }

    @Override
    protected void open() {
        super.open();
        System.out.println("直立样式手机...");
    }

    @Override
    protected void close() {
        super.close();
        System.out.println("直立样式手机...");
    }

    @Override
    protected void call() {
        super.call();
        System.out.println("直立样式手机...");
    }
}

折叠手机类,继承抽象类Phone:

public class FoldedPhone extends Phone {
    public FoldedPhone(Brand brand) {
        super(brand);
    }

    @Override
    protected void open() {
        super.open();
        System.out.println("折叠样式手机...");
    }

    @Override
    protected void close() {
        super.close();
        System.out.println("折叠样式手机...");
    }

    @Override
    protected void call() {
        super.call();
        System.out.println("折叠样式手机...");
    }
}

测试使用:

public class Client {
    public static void main(String[] args) {
        FoldedPhone phone1 = new FoldedPhone(new XiaoMi());
        phone1.open();
        phone1.call();
        phone1.close();

        System.out.println("-------------------------------------");

        Phone phone2 = new FoldedPhone(new Vivo());
        phone2.open();
        phone2.call();
        phone2.close();

        System.out.println("-------------------------------------");

        UpRightPhone phone3 = new UpRightPhone(new XiaoMi());
        phone3.open();
        phone3.call();
        phone3.close();

        System.out.println("-------------------------------------");

        UpRightPhone phone4 = new UpRightPhone(new Vivo());
        phone4.open();
        phone4.call();
        phone4.close();
    }
}

运行结果:

小米手机开机...
折叠样式手机...
小米手机打电话...
折叠样式手机...
小米手机关机...
折叠样式手机...
-------------------------------------
Vivo手机开机...
折叠样式手机...
Vivo手机打电话...
折叠样式手机...
Vivo手机关机...
折叠样式手机...
-------------------------------------
小米手机开机...
直立样式手机...
小米手机打电话...
直立样式手机...
小米手机关机...
直立样式手机...
-------------------------------------
Vivo手机开机...
直立样式手机...
Vivo手机打电话...
直立样式手机...
Vivo手机关机...
直立样式手机...

使用桥接模式改进传统方式,让程序具有搞好的扩展性,利用程序维护。

使用桥接模式对应的类图-手机操作问题.png

JDBC中的桥接模式

JDBC中的桥接模式.png

JDBC中的ConnectionImpl:

JDBC中的ConnectionImpl.png

JDBC中的Driver:

JDBC中的Driver.png

JDBC中的Connection:

JDBC中的Connection.png

JDBC中的DriverManager:它没有子类继承,这跟桥接模式有一点点不一样。

JDBC中的DriverManager.png

正文到此结束
本文目录