浅学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
相关推荐
Wang's Blog1 小时前
Java 项目部署之 Docker工具快速入门: Docker 是什么以及它如何解决部署环境问题
java·开发语言·docker
老木避暑研究所1 小时前
从原始数据到洞察:一次完整的避暑房环境数据采集、清洗与可视化分析
java·开发语言
程序喵大人2 小时前
【C++入门】编译链接模型 - 05 ODR 为什么会让重复定义变成工程炸点
开发语言·c++·编译链接·odr
weixin199701080162 小时前
《淘宝TOP API:落地方案、接口边界与业务踩坑 —— 聚石塔内外价差 10 倍的真相》(附 Python 源码)
开发语言·python
前端 贾公子2 小时前
LangGraph == 图的状态(State)管理 (上)
java·开发语言·数据库
huaweichenai2 小时前
spring boot 实现file文件上传
java·spring boot·后端
VX_bysjlw9852 小时前
数码设备销售网站设计与实现39138-计算机毕设原创(免费领源码+带部署教程)
java·vue.js·spring boot·mysql·tomcat·mybatis·idea
荣码3 小时前
从0到1搭一个生产级RAG系统:串联前面21篇所有知识
java·python
xuxigifxfh3 小时前
牛客:HJ170 01序列
java·开发语言·算法·华为机考
朝朝辞暮i3 小时前
C++ 第 33 课:事件循环——spin() 到底在干什么
开发语言·c++·算法