桥接模式的学习

手机操作问题:

​  现在不同的手机会装载不同的系统来实现操作(开机、关机)

  eg:

​   手机

​     小米 -> MIUI

​     OPPO->COLORS

​     ONEPLUS ->COLORS/H2OS

​     …

 

传统方案解决手机操作问题

在这里插入图片描述

​ 存在问题:

​   1.拓展问题,容易类爆炸。即当我们需要添加新品牌,及其以下的系统时,则就要新建相对的类。

​   2.违反了单一职责原则,当我们添加一个手机品牌时,可能会有增加许多的系统。增加了代码维护成本。

 

桥接模式

 将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构, 从而能在开发时分别使用。
 
抽象部分与实现部分

   抽象部分 是一些实体的高阶控制层。 该层自身不完成任何具体的工作, 它需要将工作委派给实现部分层 (也被称为平台)。

   在实际的程序中, 抽象部分是图形用户界面 (GUI), 而实现部分则是底层操作系统代码 (API), GUI 层调用 API 层来对用户的各种操作做出响应。

  一般来说, 你可以在两个独立方向上扩展这种应用:

  开发多个不同的 GUI (例如面向普通用户和管理员进行分别配置)
  支持多个不同的 API (例如, 能够在 Windows、 Linux 和 macOS 上运行该程序)。

  该模式建议将类拆分为两个类层次结构:

  抽象部分: 程序的 GUI 层。
  实现部分: 操作系统的 API。

  抽象对象控制程序的外观, 并将真实工作委派给连入的实现对象。 不同的实现只要遵循相同的接口就可以互换, 使同一 GUI 可在 Windows 和 Linux 下运行。

最后的结果是: 你无需改动与 API 相关的类就可以修改 GUI 类。 此外如果想支持一个新的操作系统, 只需在实现部分层次中创建一个子类即可。

 

桥接模式结构

在这里插入图片描述  1.抽象部分 (Abstraction)提供高层控制逻辑, 依赖于完成底层实际工作的实现对象。

 2.实现部分 (Implementation) 为所有具体实现声明通用接口。 抽象部分仅能通过在这里声明的方法与实现对象交互。

抽象部分可以列出和实现部分一样的方法, 但是抽象部分通常声明一些复杂行为, 这些行为依赖于多种由实现部分声明的原语操作。

 3.具体实现 (Concrete Implementations) 中包括特定于平台的代码。

 4.精确抽象 (Refined Abstraction) 提供控制逻辑的变体。 与其父类一样, 它们通过通用实现接口与不同的实现进行交互。

 5.通常情况下,客户端 (Client)仅关心如何与抽象部分合作。 但是, 客户端需要将抽象对象与一个实现对象连接起来。

桥接模式适合应用场景

 1.如果你想要拆分或重组一个具有多重功能的庞杂类 (例如能与多个数据库服务器进行交互的类), 可以使用桥接模式。

 2.如果你希望在几个独立维度上扩展一个类, 可使用该模式。

 3.如果你需要在运行时切换不同实现方法, 可使用桥接模式。
 

实现方式

 1.明确类中独立的维度。 独立的概念可能是: 抽象/平台, 域/基础设施, 前端/后端或接口/实现。

 2.了解客户端的业务需求, 并在抽象基类中定义它们。

 3.确定在所有平台上都可执行的业务。 并在通用实现接口中声明抽象部分所需的业务。

 4.为你域内的所有平台创建实现类, 但需确保它们遵循实现部分的接口。

 5.在抽象类中添加指向实现类型的引用成员变量。 抽象部分会将大部分工作委派给该成员变量所指向的实现对象。

 6.如果你的高层逻辑有多个变体, 则可通过扩展抽象基类为每个变体创建一个精确抽象。

 7.客户端代码必须将实现对象传递给抽象部分的构造函数才能使其能够相互关联。 此后, 客户端只需与抽象对象进行交互, 无需和实现对象打交道。
 

桥接模式优缺点

 优点:
  ✔️你可以创建与平台无关的类和程序。
  ✔️客户端代码仅与高层抽象部分进行互动, 不会接触到平台的详细信息。
  ✔️开闭原则。 你可以新增抽象部分和实现部分, 且它们之间不会相互影响。
  ✔️单一职责原则。 抽象部分专注于处理高层逻辑, 实现部分处理平台细节。

 缺点:
 ❌对高内聚的类使用该模式可能会让代码更加复杂。

 

更改后的手机操作问题:

在这里插入图片描述

代码:

public interface OS {
    void open();
    void close();
    void call();
}
public class Phone {
    private OS os;

    public Phone(OS os){
        super();
        this.os = os;
    }

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

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

    protected void call(){
        this.os.call();
    }
}
public class MIUI implements OS {
    @Override
    public void open() {
        System.out.println("MIUI opening...");
    }

    @Override
    public void close() {
        System.out.println("MIUI choseing...");
    }

    @Override
    public void call() {
        System.out.println("MIUI calling...");
    }
}

public class H2OS implements OS {
    @Override
    public void open() {
        System.out.println("H2OS opening...");
    }

    @Override
    public void close() {
        System.out.println("H2OS choseing...");
    }

    @Override
    public void call() {
        System.out.println("H2OS calling...");
    }
}
public class XIAOMI extends Phone {
    public XIAOMI(OS os) {
        super(os);
    }

    protected void open(){
        System.out.print("XIAOMI-");
        super.open();
    }

    protected void close(){
        System.out.print("XIAOMI-");
        super.close();
    }

    protected void call(){
        System.out.print("XIAOMI-");
        super.call();
    }
}

public class ONEPLUS extends Phone {
    public ONEPLUS(OS os) {
        super(os);
    }

    protected void open(){
        System.out.print("ONEPLUS-");
        super.open();
    }

    protected void close(){
        System.out.print("ONEPLUS-");
        super.close();
    }

    protected void call(){
        System.out.print("ONEPLUS-");
        super.call();
    }
}
public class Client {
    public static void main(String[] args) {
        //小米手机搭载MIUI
        Phone xiaomi_miui = new XIAOMI(new MIUI());
        xiaomi_miui.open();
        xiaomi_miui.call();
        xiaomi_miui.close();

        System.out.println("-----");
        //一加搭载H2OS
        Phone oneplus_h2os = new ONEPLUS(new H2OS());
        oneplus_h2os.open();
        oneplus_h2os.call();
        oneplus_h2os.close();

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

        //小米手机搭载H2OS
        Phone xiaomi_h2os = new XIAOMI(new H2OS());
        xiaomi_h2os.open();
        xiaomi_h2os.call();
        xiaomi_h2os.close();

    }
}

 
注意:

​  1.实现了抽象和实现的分离,从未极大的提供了系统灵活性。让抽象部分和实现部分独立开来,这有助于系统进行分层设计,从未产生更好的结构化系统。

​  2.对于系统的高层部分,便只需知道抽象部分和实现部分的接口即可,其他部分由具体业务来完成。

​  3.桥接模式用来替代多层继承方案,可以减少子类的个数,降低系统的管理与维护。

​  4.但桥接模式的引入增加了系统的理解和设计难度,因为聚合关联建立在抽象层,因此开发时要针对抽象进行设计。

适用的应用场景:

​  1)JDBC驱动程序

​  2)银行转正系统

​    分类:网上,柜台,AMT

​    类型:普通用户、银卡用户、金卡用户

​  3)消息管理

​    类型:即时消息、延时消息

​    分类:短信、邮件、通讯软件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值