浅学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
相关推荐
鸭子程序员14 分钟前
c++ 算法
开发语言·c++·算法
搬砖ing换来金砖30 分钟前
Python入门-Task02
开发语言·python
雨中散步撒哈拉39 分钟前
17、做中学 | 初三下期 Golang文件操作
开发语言·后端·golang
倚肆43 分钟前
Spring Boot CORS 配置详解:CorsConfigurationSource 全面指南
java·spring boot·后端
q***72191 小时前
Spring Boot(快速上手)
java·spring boot·后端
CoderYanger1 小时前
C.滑动窗口——1423. 可获得的最大点数
java·开发语言·算法·leetcode·1024程序员节
全栈陈序员1 小时前
【Python】基础语法入门(九)—— 代码规范、调试技巧与性能初探
开发语言·python·代码规范
Swift社区1 小时前
StackOverflowError 栈溢出的原因与实战解决方案
java·spring boot·spring
合作小小程序员小小店1 小时前
图书管理系统,基于winform+sql sever,开发语言c#,数据库mysql
开发语言·数据库·sql·microsoft·c#
Yue丶越1 小时前
【C语言】数据在内存中的存储
c语言·开发语言·网络