浅学Java-设计模式

1. 单例模式(Singleton)

java 复制代码
// Spring Bean 默认就是单例
@Service
public class UserService {
    // 整个应用只有一个 UserService 实例
}

2. 工厂模式(Factory)

java 复制代码
// 策略管理器就是工厂模式的应用
@Component
public class SmsStrategy {
    private Map<String, SmsService> SMS_SERVICES;
    
    // 根据类型获取对应的实例
    public SmsService getService(String channel) {
        return SMS_SERVICES.get(channel);
    }
}

3. 策略模式(Strategy)

java 复制代码
// 定义策略接口
interface SmsService {
    void send(String mobile, String code);
}

// 实现策略
class AliyunSmsService implements SmsService { }
class TencentSmsService implements SmsService { }

// 策略管理器
class SmsStrategy {
    public void send(String channel, String mobile, String code) {
        SmsService service = getService(channel);
        service.send(mobile, code);
    }
}

4.模板方法模式(Template Method)

java 复制代码
// AbstractListener 是模板方法模式
public abstract class AbstractListener<T> {
    
    // 模板方法(定义流程)
    public void consumerMsg(Message msg, Channel channel) {
        T data = resolverMsg(msg);        // 子类实现
        String key = getUniqueKey(data);  // 子类实现
        
        try {
            consumer(data);  // 子类实现
            channel.basicAck(deliveryTag, true);
        } catch (Exception e) {
            handleException(e);  // 统一异常处理
        }
    }
    
    // 抽象方法(子类必须实现)
    protected abstract T resolverMsg(Message msg);
    protected abstract String getUniqueKey(T data);
    protected abstract void consumer(T data);
}

// 具体实现
public class PayslipNoticeListener extends AbstractListener<PayslipNoticeDto> {
    
    @Override
    protected PayslipNoticeDto resolverMsg(Message msg) {
        // 解析消息
    }
    
    @Override
    protected String getUniqueKey(PayslipNoticeDto data) {
        return "payslip:" + data.getSn();
    }
    
    @Override
    protected void consumer(PayslipNoticeDto data) {
        // 发送工资条通知
    }
}

5.建造者模式(Builder)

java 复制代码
// Lombok @Builder 注解
@Data
@Builder
public class UserTokenDTO {
    private Integer userId;
    private String token;
    private String userName;
}

// 使用
UserTokenDTO dto = UserTokenDTO.builder()
    .userId(123)
    .token("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...")
    .userName("张三")
    .build();

6.代理模式(Proxy)

java 复制代码
// Feign 客户端就是代理模式
@FeignClient(url = "http://localhost:8082")
public interface PayrollClient {
    @GetMapping("/payroll/{id}")
    Payroll getById(@PathVariable Long id);
}

// Spring 生成代理对象,拦截方法调用,发送 HTTP 请求

7.观察者模式(Observer)

java 复制代码
// Spring 事件机制
@Component
public class UserEventListener {
    
    // 监听用户注册事件
    @EventListener
    public void onUserRegister(UserRegisterEvent event) {
        log.info("用户注册事件: userId={}", event.getUserId());
        // 发送欢迎邮件
        // 发放新人优惠券
    }
}

// 发布事件
@Service
public class UserService {
    
    @Autowired
    private ApplicationEventPublisher publisher;
    
    public void register(User user) {
        // 保存用户
        userDao.save(user);
        
        // 发布事件
        publisher.publishEvent(new UserRegisterEvent(user.getId()));
    }
}

8.责任链模式(Chain of Responsibility)

java 复制代码
// 拦截器链就是责任链模式
请求
 ↓
拦截器1(认证)
 ↓
拦截器2(权限)
 ↓
拦截器3(日志)
 ↓
Controller
相关推荐
551只玄猫2 小时前
【数学建模 matlab 实验报告12】聚类分析和判别分析
开发语言·数学建模·matlab·课程设计·聚类·实验报告
小陈工4 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
H Journey4 小时前
C++之 CMake、CMakeLists.txt、Makefile
开发语言·c++·makefile·cmake
一定要AK9 小时前
Spring 入门核心笔记
java·笔记·spring
A__tao9 小时前
Elasticsearch Mapping 一键生成 Java 实体类(支持嵌套 + 自动过滤注释)
java·python·elasticsearch
KevinCyao9 小时前
java视频短信接口怎么调用?SpringBoot集成视频短信及回调处理Demo
java·spring boot·音视频
lly2024069 小时前
C 标准库 - `<stdio.h>`
开发语言
沫璃染墨9 小时前
C++ string 从入门到精通:构造、迭代器、容量接口全解析
c语言·开发语言·c++
jwn9999 小时前
Laravel6.x核心特性全解析
开发语言·php·laravel
迷藏4949 小时前
**发散创新:基于Rust实现的开源合规权限管理框架设计与实践**在现代软件架构中,**权限控制(RBAC)** 已成为保障
java·开发语言·python·rust·开源