• 设计模式之桥接模式(六)


    目录

    1. 背景

    1.1 问题描述

    1.2 桥接模式概述

    2. 桥接模式

    2.1 桥接模式解决手机问题

     2.2 桥接模式在JDBC中的应用


    1. 背景

    1.1 问题描述

     传统解决

    • 存在类爆炸
    • 违反单一职责原则(当我们增加手机样式时,要同时增加所有品牌的手机)
    • 扩展性差
    • 用桥接模式来解决

    1.2 桥接模式概述

    实现抽象放在两个不同的类层次中,使两个层次可以独立改变。

    Bridge模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展。

    用来解决有多种分类问题:

    • 手机问题:多种品牌(小米,华为),多种样式(直面屏,折叠屏)。将品牌抽象为接口,在手机抽象类中聚合品牌,在手机子类中进行样式和品牌的组合,将手机抽象类当作“桥”。
    • 银行转账系统:转账分类(网上转账,柜台转账,AMT转账转账),用户类型(普通用户,银卡用户,金卡用户)。将转账类型抽象为接口,在用户抽象类中聚合转账,在用户子类中实现用户和转账类型组合。
    • JDBC驱动:DriverManager实现注册驱动和获取连接。DriverManager当作“桥”,java.sql.Connection抽象为借口,下面有多种接口继承和具体实现(mysql,oracle,DB2,SQL Server)。

    桥接模式类图

    • Client类:桥接模式的调用者
    • 抽象类(Abstraction) :维护了Implementor/即它的实现类ConcreteImplementorA...二者是聚合关系, Abstraction充当桥接类
    • RefinedAbstraction:是 Abstraction抽象类的子类
    • Implementor:行为实现类的接口
    • ConcretelmplementorA/B:行为的具体实现类
    • 这里的抽象类和接口是聚合的关系,其实调用和被调用关系

    2. 桥接模式

    2.1 桥接模式解决手机问题

    接口

    1. //接口
    2. public interface Brand {
    3. void open();
    4. void close();
    5. void call();
    6. }

    实现类 

    1. public class Vivo implements Brand {
    2. @Override
    3. public void open() {
    4. // TODO Auto-generated method stub
    5. System.out.println(" Vivo手机开机 ");
    6. }
    7. @Override
    8. public void close() {
    9. // TODO Auto-generated method stub
    10. System.out.println(" Vivo手机关机 ");
    11. }
    12. @Override
    13. public void call() {
    14. // TODO Auto-generated method stub
    15. System.out.println(" Vivo手机打电话 ");
    16. }
    17. }

    抽象类(桥)

    1. public abstract class Phone {
    2. //组合品牌
    3. private Brand brand;
    4. //构造器
    5. public Phone(Brand brand) {
    6. this.brand = brand;
    7. }
    8. protected void open() {
    9. this.brand.open();
    10. }
    11. protected void close() {
    12. brand.close();
    13. }
    14. protected void call() {
    15. brand.call();
    16. }
    17. }

    子类

    1. public class UpRightPhone extends Phone {
    2. //构造器
    3. public UpRightPhone(Brand brand) {
    4. super(brand);
    5. }
    6. public void open() {
    7. super.open();
    8. System.out.println(" 直立样式手机 ");
    9. }
    10. public void close() {
    11. super.close();
    12. System.out.println(" 直立样式手机 ");
    13. }
    14. public void call() {
    15. super.call();
    16. System.out.println(" 直立样式手机 ");
    17. }
    18. }

    client

    1. public class Client {
    2. public static void main(String[] args) {
    3. //获取折叠式手机 (样式 + 品牌 )
    4. Phone phone1 = new FoldedPhone(new XiaoMi());
    5. phone1.open();
    6. phone1.call();
    7. phone1.close();
    8. System.out.println("=======================");
    9. Phone phone2 = new FoldedPhone(new Vivo());
    10. phone2.open();
    11. phone2.call();
    12. phone2.close();
    13. System.out.println("==============");
    14. UpRightPhone phone3 = new UpRightPhone(new XiaoMi());
    15. phone3.open();
    16. phone3.call();
    17. phone3.close();
    18. System.out.println("==============");
    19. UpRightPhone phone4 = new UpRightPhone(new Vivo());
    20. phone4.open();
    21. phone4.call();
    22. phone4.close();
    23. }
    24. }

     2.2 桥接模式在JDBC中的应用

    Jdbc的 Driver接口,如果从桥接模式来看,Driver就是一个接口,下面可以有MySQL 的 Driver,Oracle的Driver,这些就可以当做实现接口类。

  • 相关阅读:
    ubuntu下vscode的安装包
    搜维尔科技:【周刊】适用于虚拟现实VR中的OptiTrack
    3D桌面端可视化引擎HOOPS Visualize助力工业制造开发AR/VR功能,实现质量控制与检验可视化!
    Promise
    制作一个简单HTML传统端午节日网页(HTML+CSS)
    Gd-DOTA,CAS:72573-82-1,钆特酸
    RabbitMQ 安装
    Javaweb实现数据库简单的增删改查
    Oracle关闭回收站
    Vue中引入echarts的步骤
  • 原文地址:https://blog.csdn.net/weixin_45734473/article/details/127746278