设计模式——结构类——桥接模式

一、理论

Decouple an abstraction from its implementation so that the two can vary independently.
将抽象和实现解耦,使得两者可以独立地变化。

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

在这里插入图片描述

  • Abstraction——抽象化角色
    它的主要职责是定义出该角色的行为,同时保存一个对实现化角色的引用,该角色一般是抽象类。
  • Implementor——实现化角色
    它是接口或者抽象类,定义角色必需的行为和属性。抽象角色和实现角色是聚合的关系,其实调用和被调用关系。
  • RefinedAbstraction——修正抽象化角色
    它引用实现化角色对抽象化角色进行修正。
  • ConcreteImplementor——具体实现化角色
    它实现接口或抽象类定义的方法和属性。

简单来说:抽象角色引用实现角色,或者说抽象角色的部分实现是由实现角色完成的。

二、代码

公司是通过生成产品,销售产品来获取利润。

产品为实现化角色:
IProduct.java

public interface IProduct {

    void beProduced();

    void beSold();
}

公司为抽象化角色,并聚合产品:
Company.java

public abstract class Company {

    private IProduct product;

    public Company(IProduct product) {
        this.product = product;
    }

    public void makeProfile() {
        this.product.beProduced();
        this.product.beSold();
    }
}

现在有ipad和小米手机2个产品被生产和销售(具体实现化角色):
IpadProduct.java

public class IpadProduct implements IProduct {
    @Override
    public void beProduced() {
        System.out.println("ipad生产出来了");
    }

    @Override
    public void beSold() {
        System.out.println("ipad卖掉了");
    }
}

XiaoMiProduct.java

public class XiaoMiProduct implements IProduct {
    @Override
    public void beProduced() {
        System.out.println("小米手机生产出来了");
    }

    @Override
    public void beSold() {
        System.out.println("小米手机卖掉了");
    }
}

有的公司销售商品可以赚大钱,有的赚小钱,有的亏本,现在这个电子厂生产ipad和小米手机赚了大钱(修正抽象化角色):
ElecCommpany.java

public class ElecCompany extends Company{
    public ElecCompany(IProduct product) {
        super(product);
    }

    @Override
    public void makeProfile() {
        super.makeProfile();
        System.out.println("电子厂赚大钱了");
    }
}

测试:

public class Client {
    public static void main(String[] args) {
        ElecCompany company=new ElecCompany(new IpadProduct());
        company.makeProfile();

        company=new ElecCompany(new XiaoMiProduct());
        company.makeProfile();
    }
}

如果另外一个电子厂,生产同样的商品,赔钱了,可以扩展另外一个修正的抽象化角色。

如果一家房地产公司盖房子、卖房子赚钱了,可以扩展房子商品的具体实现化角色,和房地产公司修正的抽象化角色。

三、总结

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

  2. 对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了,其它的部分由具体业务来完成。

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

  4. 桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程

  5. 桥接模式要求正确识别出系统中两个独立变化的维度(抽象、和实现),因此其使用范围有一定的局限性,即需要有这样的应用场景。

四、桥接模式和工厂模式的区别

工厂模式主要负责创建对象而桥模式主要负责将抽象的不同形式与具体实现部分分离。

最典型的例子就是JDBC。JDBC API(Sun)提供抽象部分,各个JDBC驱动厂商(Oracle, Mysql…)提供实现部分。新的JDBC驱动可以“即插即用”在JDBC API中,而不需要修改我们调用者的代码。这就是所谓的抽象部分(JDBC API)与它的实现部分(JDBC Driver)分离。从宏观角度JDBC可以称为桥模式,但是从微观角度,JDBC中又使用了很多其他设计模式,比如工厂模式,策略模式等。

工厂模式是一个产品,自己只是提出来需要厂家生产,而桥接模式则是自己的产品去调用某个对象里的某个方法而已。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值