• 用桥接模式(Bridge)实现开放接口系统


    桥接模式是设计模式中比较难的一种,其原文叙述是:“将抽象部分与它的具体实现部分分离,使它们都可以独立地变化,属于结构型模式。”表述也很抽象,其本质是通过一个抽象类A的构造函数传入一个Interface类B作为参数,这样在实现抽象类A和实例化时,传入抽象类B的实现类,可以实现抽象类A和B的灵活配置,如此完成实现两个部分都可以独立变化的目的。

    在软件系统开发中,开放接口系统的设计是比较常见的。开放接口系统一般也包含两个独立变化的部分:

    一是鉴权系统,一般包括了token解析、时间戳的对比等,而且往往对接的各种系统都有自己的鉴权方式,不同系统鉴权模式各不相同。

    二是接口数据,一般用于发送http请求或者从对方返回的http响应中获取数据(这里暂不讨论通过监听http接口接受被动访问的接口,那些接口一般用controller实现)。

    这两个部分很适合用桥接模式实现:

    1. //抽象化的鉴权类
    2. public Interface Authenticator{
    3. void OperationAuth();
    4. }
    5. //具体鉴权类
    6. public class ConcreteAuth implements Authenticator{
    7. //生成Token并放到请求头
    8. String token = TokenCreater.createToken(SessionManager.getSK());
    9. Request.addHeader(token);
    10. }
    11. //抽象的桥接类,包含了抽象的鉴权接口和抽象的HTTP请求方法
    12. public abstract class AbstractionHttpInterface(){
    13. //这里通过构造函数,声明抽象的鉴权接口
    14. protected Authenticator auth;
    15. protected AbstractionInterface(Authenticator auth){
    16. this.auth = auth
    17. }
    18. //声明一个抽象的HTTP请求
    19. public abstract HTTPResponse SendHttpRequest(HttpRequest body);
    20. }
    21. //实现一个具体的接口
    22. class GetDeviceInterface extends AbstractionHttpInterface{
    23. //通过构造函数传递鉴权方法
    24. protected GetDeviceInterface(Authenticator auth) {
    25. super(auth);
    26. }
    27. //接口的请求体构造与实现方法
    28. public HTTPResponse SendHttpReques(HttpRequest body) {
    29. //这里写接口的具体请求方法
    30. return Request.sendRequest(body);
    31. }
    32. }

    注:以上代码并非完整代码,仅供理解原理。

    使用:

    1. //先声明鉴权方法
    2. Authenticator authMethod = new ConcreteAuth();
    3. //具体的设备数据获取类
    4. AbstractionHttpInterface getDeviceRequest = new GetDeviceInterface(authMethod);
    5. getDeviceRequest.SendHttpRequest();

  • 相关阅读:
    vue项目获得开源代码之后跳过登录界面
    MR混合现实模拟消防安全演练场景实训
    Springioc注释使用
    [附源码]Python计算机毕业设计SSM京东仓库管理系统(程序+LW)
    「科技与安全」RK3568J核心板让隔离网闸更强大
    普通人做自媒体怎么赚钱?
    安卓常见设计模式6------代理模式(Kotlin版)
    Vue中$nextTick实现源码解析
    Explain 关键字
    Kafka牛逼在哪里?
  • 原文地址:https://blog.csdn.net/dongzhiyu/article/details/134001022