浅学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
相关推荐
带刺的坐椅6 分钟前
Solon 的日志设计哲学:不只是用 SLF4J 做统一门面
java·logback·solon·log4j2
雾时之林15 分钟前
python--字符串
开发语言·python
Flittly18 分钟前
【雕虫大技】Agent 动态 Skill 供应链安全加固(二):执行隔离沙箱实战
java·spring boot·spring
程序员黑豆27 分钟前
Java变量详解:从入门到精通
java·前端·ai编程
karry_k28 分钟前
Skill 到底是什么?从提示词、脚本到多智能体工作流的完整指南
java·人工智能·后端
qq_4017004141 分钟前
Qt自定义信号槽详解:带参发射 vs sender()获取,两种多信号关联方案全掌握
java·数据库·qt
啊哈一半醒1 小时前
Go 语言 Context 全方位详解:原理、实战与避坑
开发语言·后端·golang
铅笔侠_小龙虾1 小时前
rust 学习(9):结构体
开发语言·学习·rust
此生决int1 小时前
深入理解C++系列(11)——stack、queue和priority_queue
开发语言·c++
剧中有戏1 小时前
抽象工厂模式从入门到精通:一个多云存储案例的完整剖析(修订版)
设计模式