• 最常用模式


    引言:好的Code总是出奇的像,坏的Code也是出奇的像,这篇文章,我不会贴代码,尽量用自己的理解表达这些模式的含义,在类与类之前的关系表达上,可尽量使用这些模式。

    偏门的就不记了,记录下工作中应用最最最广泛的一些模式,在代码呼之欲出的时候,可以考虑下,我们应当如何组织Class,如何在增加新功能的时候,可以不修改原有Class,或者修改很少,我们应该拥抱开闭原则,做到代码低耦合,高内聚,这就需要使用下面的一些个思维模式。

    单例

    确保在当前应用实例(进程,fork除外)中,仅仅存在一个实例,特别针对连接池,线程池,工厂类,配置类等这些hold大量资源的类必须单例。

    1. 饿汉模式,类加载就初始化,使用静态Feild,由jvm确保竞争。
    2. 懒汉模式,延迟加载,类锁+Double Check加大并发,由类锁和双重检测确保竞争。
    3. 懒汉模式,延迟加载,内部静态类,由jvm确保竞争,holder,tomcat里面有这种用法。

    职责链

    业务逻辑需要经过一系列的处理逻辑流才能有结果,每个逻辑流相互独立,那么,非常适合使用职业链,相同的Contex经过不同的链条处理,职业链的触发方式一般有两种

    • foreach的方式,一个一个的遍历调用hander,控制中心主动调用全量,优点的简单,但是单个hander无法控制链条的调用,不好实现一些复杂的语义,如around。
    • 递归的方式,当前Hander通过ChainFilter.filter控制下一个Hander的调用,使用dfs的优点非常明显,Filter之前的逻辑表示正向输入流,filter之后的逻辑就是反向输出流,针对http请求非常的合适,filter之前的处理request,filter之后的处理response。

    Tomcat的Filter,servicecomb的Filter,mvc的Hander,aop的intercepter,这些职业链都是使用递归调用,详情可以见部分开源源代码。针对aop,递归的形式非常适合表达before,around,after的语义,可以想想dfs前后的逻辑区别。

    懒得贴代码了。

    观察者

    • Spring的EventBus,Apollo的配置变更通知等,非常适合工程中模块与模块的接藕。当某个类A的状态变更,需要通知另外一个类B,则B需要实现的A的观察接口类,然后注册到A上,在A变化的时候,A主动调用对应的观察者列表。

    • Spring 实现了简单的事件总线,状态类使用总线发布事件类的时候,会根据ClassType找到全部监听当前事件的类,然后同步或者异步通过反射调用这些类的方法。

    • 业务代码可简单使用接口,实现监听者模式。

    访问者

    工厂+策略

  • 相关阅读:
    js---箭头函数
    C++11之追踪返回类型
    Linux下命令行文件创建删除、目录创建删除
    【Vue】(二)Vue组件化思想、全局组件与局部组件、父子组件、父子组件通信、slot-插槽
    传播问卷调查数据不够?自己生成假数据!
    JVM区域划分
    vim搜索功能
    详解K8S网络模型(包含Service讲解)
    初次接触Sharding-JDBC并实际应用
    知识图谱+推荐系统 文献阅读
  • 原文地址:https://blog.csdn.net/u010710458/article/details/126551860