浅学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
相关推荐
indexsunny几秒前
互联网大厂Java面试实战:Spring Boot与微服务在电商场景的应用解析
java·spring boot·redis·微服务·kafka·gradle·maven
2301_797312263 分钟前
学习java37天
开发语言·python
xifangge20255 分钟前
PHP 接口跨域调试完整解决方案附源码(从 0 到定位问题)
开发语言·php
go_bai6 分钟前
Linux-网络基础
linux·开发语言·网络·笔记·学习方法·笔记总结
smileNicky11 分钟前
Lombok @Data 在 IDEA 中运行报错解决方案
java·ide·intellij-idea
计算机学姐11 分钟前
基于SpringBoot的汉服租赁系统【颜色尺码套装+个性化推荐算法+数据可视化统计】
java·vue.js·spring boot·后端·mysql·信息可视化·推荐算法
qq_54702617914 分钟前
Maven 仓库管理
java·maven
天天摸鱼的java工程师16 分钟前
线程池深度解析:核心参数 + 拒绝策略 + 动态调整实战
java·后端
mjhcsp16 分钟前
C++ KMP 算法:原理、实现与应用全解析
java·c++·算法·kmp
好大哥呀20 分钟前
C++ IDE
开发语言·c++·ide