完全透析设计模式(4)- 桥接模式

桥接模式(Bridge)

桥接模式属于结构型设计模式,其核心的设计思想就是将抽象化结构和实现化结构隔离开来,使两者达到解耦的目的,同时又将两者通过聚合连接起来,配合完成功能。目的就是将抽象部分与实现部分分离,使它们都可以独立的变化,同时它们之间还存在联系,毕竟使用者最终还是要通过调用抽象化的对象去间接调用具体实现化的对象。桥接模式可以让抽象化结构和实现化结构达到极其良好的扩展能力,这是该模式最大的优点所在。

桥接模式的角色

在这里插入图片描述

- 抽象化(Abstraction)

定义抽象化的操作方法,同时需要依赖实现化对象。

- 修正抽象化(RefinedAbstraction)

实现抽象化对象,可以修正和扩展抽象化定义的功能,同时通过父类抽象化已经依赖的实现化对象去调用其接口方法,最终达到调用具体实现对象的功能。

- 实现化(Implementor)

实现化其实就是一个普通的接口,定义真正实现化功能的接口,该接口只要符合可以供修正抽象化对象调用即可,其余方面没有任何的必需联系。可以理解抽象化是一个高层次的结构,是维度较大的功能,而实现化是一个低层次的结构,是维度较小的功能,所以很多时候抽象化的对象都会同时依赖多个实现化对象去共同完成功能。

- 具体实现化(ConcreateImplementor)

具体实现化对象继承并实现实现化接口,其他方面无需关心,这是桥接模式优点的具体体现,具体实现化对象和抽象化对象是完全解耦的结构,所以具体实现化对象具有良好的扩展能力,代码的修改和扩展不会影响到抽象化对象。对于调用者来说,调用抽象化对象功能时只需要传递不同的具体化对象,即可达到动态地转换自己想要的功能的目的。

实践桥接模式

假设现在我们需要实现一个消息通知的功能,通知的类型包括了短信和邮件,同时消息发送之前需要记录下消息通知的日志。我们来分析一波这个需求,消息通知功能可以理解为是一个高层次结构的方法,因为在发送通知前后还可能包含有做其他的操作,是一个聚集了多个细粒度小功能的接口,而短信和邮件则可以理解为是一个低层次结构的方法,即细粒度的小功能接口, 所以我们可以使用桥接模式去实现该功能,最终可以达到不仅功能实现,而且还能够随时地修改、扩展短信和邮件的具体实现,例如需要切换短信的服务提供商,直接修改短信具体实现对象即可,不需要修改上层结构修正抽象化对象的代码。

public abstract class NotifyApi {

    /**依赖实现化接口对象*/
    protected MessageApi messageApi;

    public NotifyApi(MessageApi messageApi) {
        this.messageApi = messageApi;
    }

    public abstract void notify(String toUser);

}

定义实现化接口,包含细粒度的接口功能,发送消息给某个用户

public interface MessageApi {

    /**发送消息给某个用户*/
    void send(String toUser);

}

定义修正抽象化对象,通过抽象化依赖的实现化接口对象去掉用接口方法,同时还可以扩展抽象化接口例如记录通知日志。

public class MessageNotify extends NotifyApi {

    public MessageNotify(MessageApi messageApi) {
        super(messageApi);
    }

    @Override
    public void notify(String toUser) {
        System.out.println("其他操作,记录日志");
        messageApi.send(toUser);
    }

}

拥有良好扩展能力的具体实现化对象。

public class EmailMessage implements MessageApi {

    @Override
    public void send(String toUser) {
        System.out.println("发送邮件给"+toUser);
    }

}
public class SMSMessage implements MessageApi {

    @Override
    public void send(String toUser) {
        System.out.println("发送短信给"+toUser);
    }

}

客户端调用通过切换不同的具体实现对象,动态切换功能。


public class Main {

    public static void main(String[] args) {
        //发送邮件给小明
        NotifyApi notifyApi = new MessageNotify(new EmailMessage());
        notifyApi.notify("小明");

        //发送短信给小张
        notifyApi = new MessageNotify(new SMSMessage());
        notifyApi.notify("小张");
    }

}
其他操作,记录日志
发送邮件给小明
其他操作,记录日志
发送短信给小张

扩展设计模式-类层次结构

有的资料中讲到桥接模式的作用就是在“类的功能层次结构”和“类的实现层次结构”之间搭建桥梁。我们来理解一下类层次结构,假设有一个类ObjA,如果我们想扩展它的功能,可以通过定义一个继承了ObjA的子类ObjB,在ObjB添加新的功能方法即可,这样的类层次结构就被称为“类的功能层次机构”。假设定义了一个接口InterA,然后通过子类去负责实现InterA的抽象方法,子类不是为了扩展功能,而是去实现父类接口方法,这样的类层次结构就被称为“类的实现层次结构”。
对照我们上面的例子NotifyApi和MessageNotify就是类的功能层次机构关系,MessageApi和 EmailMessage、SMSMessage就是类的实现层次结构关系。

在Java中的实际使用

桥接模式在java应用中一个典型的应用例子就是数据源。JdbcAccessor和JdbcTemplate分别扮演抽象化角色和修正抽象化角色,抽象化对象JdbcAccessor依赖实现化接口DataSource,DataSource提供了getConnection()接口方法,具体实现化对象有很多种,需要继承DataSource去实现getConnection()方法。调用者通过JdbcTemplate操作数据库的时候可以动态地切换不同的DataSource具体实现化对象,而上层结构和代码不需要做任何的改动,这也体现了桥接设计模式的三个优点:

  1. 能够让抽象化结构和实现化结构达到分离解耦的目的。
  2. 为具体实现化对象提供了良好的扩展能力。
  3. 客户通过调用抽象化对象即可实现功能,隐藏功能的具体实现。

在这里插入图片描述

关注公众号了解更多原创博文

Alt

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值