跳至主要內容
行为型 - 责任链模式(Chain)

责任链(Chain)

提示

责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止

在责任链模式中,客户只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递过程,请求会自动进行传递。所以责任链将请求的发送者和请求的处理者解耦了


Zenghr大约 3 分钟设计模式设计模式
Seata 全局事务不生效问题

Seata 全局事务不生效问题

提示

记录工作中遇到到 Seata 全局事务不回滚的问题

开发环境

  • Spring Boot
  • Seata 分布式事务解决方案

实际场景

在工作中遇到需要调用其他服务接口,由于项目结构问题,没有使用其他的框架去调用接口,而是自己写 HTTP 请求接口调用


Zenghr大约 2 分钟JavaJava
深度比较-DeepEqual

当我们复杂一个对象时,这个对象可以是内建数据类型,数组,结构体,map……我们在复制结构体的时候,当我们需要比较两个结构体中的数据是否相同时,我们需要使用深度比较,而不是只是简单地做浅度比较。这里需要使用到反射 reflect.DeepEqual() ,下面是几个示例

import (
    "fmt"
    "reflect"
)

type data struct {
}

func main() {

    v1 := data{}
    v2 := data{}
    fmt.Println("v1 == v2:",reflect.DeepEqual(v1,v2))
    //prints: v1 == v2: true

    m1 := map[string]string{"one": "a","two": "b"}
    m2 := map[string]string{"two": "b", "one": "a"}
    fmt.Println("m1 == m2:",reflect.DeepEqual(m1, m2))
    //prints: m1 == m2: true

    s1 := []int{1, 2, 3}
    s2 := []int{1, 2, 3}
    fmt.Println("s1 == s2:",reflect.DeepEqual(s1, s2))
    //prints: s1 == s2: true
}


Zenghr小于 1 分钟golanggolang
SpringBoot 自定义参数解析器

自定义参数解析器

在项目开发中,经常会遇到很多地方都需要获取当前的登录用户对象,根据请求的 session 或者 token 去获取用户信息,于是经常会在很多地方出现获取用户信息的代码

//根据token获取用户信息
String token = request.getHeader("token");
// 查询用户
User user = userService.getCurrentUser(token);

Zenghr大约 2 分钟SpringSpringBootSpringSpringBoot
golang基础 - 反射机制

golang 反射机制

和 Java 语言一样,Go 也实现运行时反射,这为我们提供一种可以在运行时操作任意类型对象的能力。

在 go 语言中,实现反射能力的是 reflect包,能够让程序操作不同类型的对象。其中,在反射包中有两个非常重要的 类型函数,两个函数分别是:

  • reflect.TypeOf - 能获取对象的类型的信息
  • reflect.ValueOf - 能获取对象的数据

Zenghr大约 8 分钟golanggolang
结构型 - 装饰器模式(Decorator)

装饰(Decorator)

提示

指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式

装饰器模式介绍

装饰器器的核心就是在 不改变原有类 的基础上给类新增功能

通常情况下,扩展一个类的功能会使用继承方式来实现。但继承具有静态特征,耦合度高,并且随着扩展功能的增多,子类会过多等问题。但是使用装饰器模式会是另外一种思路更为灵活,可以避免继承导致的子类过多


Zenghr大约 4 分钟设计模式设计模式
设计模式 - Overview

设计模式 - Overview

提示

设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案

为什么要使用设计模式?

使用设计模式的最终目的是 "高内聚低耦合"

  • 代码重用性:相同功能的代码,不多多次编写
  • 代码可读性:编程规范性,便于其他程序员阅读
  • 代码可扩展性:当增加新的功能后,对原来的功能没有影响

Zenghr大约 3 分钟设计模式设计模式