程序员必备的十大技能(进阶版)之设计模式与架构思维(三)

简介: 教程来源 https://wkmsa.cn/ 行为型模式聚焦对象间职责分配与通信协作。含策略(算法可插拔)、观察者(事件自动通知)、责任链(请求逐级处理)、模板方法(算法骨架复用)、状态(行为随状态切换)等核心模式,提升系统灵活性与可维护性。

四、行为型模式:对象间的职责分配与通信

行为型模式关注对象之间的职责分配和通信方式,使对象能够更好地协作。

4.1 策略模式(Strategy)—— 算法族可互换
策略模式定义一系列算法,并将每个算法封装起来,使它们可以互相替换。

// 策略接口
@FunctionalInterface
public interface DiscountStrategy {
    BigDecimal calculate(BigDecimal amount);
}

// 具体策略
public class NoDiscountStrategy implements DiscountStrategy {
    @Override
    public BigDecimal calculate(BigDecimal amount) {
        return BigDecimal.ZERO;
    }
}

public class PercentageDiscountStrategy implements DiscountStrategy {
    private final double percentage;

    public PercentageDiscountStrategy(double percentage) {
        this.percentage = percentage;
    }

    @Override
    public BigDecimal calculate(BigDecimal amount) {
        return amount.multiply(BigDecimal.valueOf(percentage / 100));
    }
}

public class FixedAmountDiscountStrategy implements DiscountStrategy {
    private final BigDecimal discountAmount;

    public FixedAmountDiscountStrategy(BigDecimal discountAmount) {
        this.discountAmount = discountAmount;
    }

    @Override
    public BigDecimal calculate(BigDecimal amount) {
        return discountAmount.min(amount);
    }
}

public class BuyXGetYFreeStrategy implements DiscountStrategy {
    private final int buyQuantity;
    private final int freeQuantity;

    public BuyXGetYFreeStrategy(int buyQuantity, int freeQuantity) {
        this.buyQuantity = buyQuantity;
        this.freeQuantity = freeQuantity;
    }

    @Override
    public BigDecimal calculate(BigDecimal amount) {
        // 简化逻辑:假设单价相同
        BigDecimal unitPrice = amount.divide(BigDecimal.valueOf(buyQuantity + freeQuantity), 
            RoundingMode.HALF_UP);
        return unitPrice.multiply(BigDecimal.valueOf(freeQuantity));
    }
}

// 上下文
public class OrderCalculator {
    private DiscountStrategy discountStrategy;

    public OrderCalculator(DiscountStrategy discountStrategy) {
        this.discountStrategy = discountStrategy;
    }

    public void setDiscountStrategy(DiscountStrategy discountStrategy) {
        this.discountStrategy = discountStrategy;
    }

    public OrderResult calculate(Order order) {
        BigDecimal subtotal = order.calculateSubtotal();
        BigDecimal discount = discountStrategy.calculate(subtotal);
        BigDecimal total = subtotal.subtract(discount);

        return new OrderResult(subtotal, discount, total);
    }
}

// 使用Lambda表达式简化策略
public class ShoppingCart {
    public static void main(String[] args) {
        Order order = new Order(199.99);

        // 使用内置函数式接口
        OrderCalculator calculator = new OrderCalculator(amount -> amount.multiply(new BigDecimal("0.1")));

        // 或者使用方法引用
        calculator.setDiscountStrategy(OrderCalculator::vipDiscount);
    }
}

4.2 观察者模式(Observer)—— 事件通知
观察者模式定义对象间的一对多依赖关系,当一个对象状态改变时,所有依赖者自动收到通知。

// 观察者接口
public interface OrderObserver {
    void onOrderCreated(OrderEvent event);
    void onOrderPaid(OrderEvent event);
    void onOrderCancelled(OrderEvent event);
}

// 具体观察者
@Component
public class InventoryObserver implements OrderObserver {
    @Override
    public void onOrderCreated(OrderEvent event) {
        // 锁定库存
        System.out.println("Inventory: Reserving stock for order " + event.getOrderId());
    }

    @Override
    public void onOrderPaid(OrderEvent event) {
        // 扣减库存
        System.out.println("Inventory: Deducting stock for order " + event.getOrderId());
    }

    @Override
    public void onOrderCancelled(OrderEvent event) {
        // 释放库存
        System.out.println("Inventory: Releasing stock for order " + event.getOrderId());
    }
}

@Component
public class NotificationObserver implements OrderObserver {
    @Override
    public void onOrderCreated(OrderEvent event) {
        System.out.println("Notification: Sending order confirmation to user " + event.getUserId());
    }

    @Override
    public void onOrderPaid(OrderEvent event) {
        System.out.println("Notification: Sending payment confirmation");
    }

    @Override
    public void onOrderCancelled(OrderEvent event) {
        System.out.println("Notification: Sending cancellation notification");
    }
}

@Component
public class LoyaltyObserver implements OrderObserver {
    @Override
    public void onOrderCreated(OrderEvent event) {
        // 不处理
    }

    @Override
    public void onOrderPaid(OrderEvent event) {
        // 积分累积
        System.out.println("Loyalty: Adding points for user " + event.getUserId());
    }

    @Override
    public void onOrderCancelled(OrderEvent event) {
        // 扣减积分
        System.out.println("Loyalty: Reversing points for user " + event.getUserId());
    }
}

// 主题(被观察者)
@Service
public class OrderEventPublisher {
    private final Map<Class<?>, List<OrderObserver>> observers = new HashMap<>();

    @PostConstruct
    public void init() {
        // 注册观察者
        register(OrderCreatedEvent.class, inventoryObserver);
        register(OrderCreatedEvent.class, notificationObserver);
        register(OrderPaidEvent.class, inventoryObserver);
        register(OrderPaidEvent.class, notificationObserver);
        register(OrderPaidEvent.class, loyaltyObserver);
        register(OrderCancelledEvent.class, inventoryObserver);
        register(OrderCancelledEvent.class, notificationObserver);
    }

    public void register(Class<?> eventType, OrderObserver observer) {
        observers.computeIfAbsent(eventType, k -> new ArrayList<>()).add(observer);
    }

    public void publish(OrderEvent event) {
        List<OrderObserver> listeners = observers.get(event.getClass());
        if (listeners != null) {
            // 异步通知,避免影响主流程
            listeners.forEach(observer -> {
                CompletableFuture.runAsync(() -> {
                    if (event instanceof OrderCreatedEvent) {
                        observer.onOrderCreated(event);
                    } else if (event instanceof OrderPaidEvent) {
                        observer.onOrderPaid(event);
                    } else if (event instanceof OrderCancelledEvent) {
                        observer.onOrderCancelled(event);
                    }
                });
            });
        }
    }
}

// 使用Spring事件机制(替代手动实现)
@Component
public class SpringEventPublisher {
    @Autowired
    private ApplicationEventPublisher publisher;

    public void createOrder(Order order) {
        // 业务逻辑...
        publisher.publishEvent(new OrderCreatedEvent(order));
    }
}

@Component
@EventListener
public class SpringInventoryListener {
    public void handleOrderCreated(OrderCreatedEvent event) {
        // 处理库存...
    }
}

4.3 责任链模式(Chain of Responsibility)
责任链模式将请求沿着处理链传递,直到有一个处理器处理它。

// 请求对象
public class LeaveRequest {
    private String employeeName;
    private int days;
    private String reason;

    // getters/setters
}

// 处理器抽象
public abstract class LeaveHandler {
    protected LeaveHandler nextHandler;

    public void setNextHandler(LeaveHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    public abstract void handleRequest(LeaveRequest request);
}

// 具体处理器
public class TeamLeadHandler extends LeaveHandler {
    private static final int MAX_DAYS = 3;

    @Override
    public void handleRequest(LeaveRequest request) {
        if (request.getDays() <= MAX_DAYS) {
            System.out.println("Team Lead approved " + request.getDays() + " days leave for " + request.getEmployeeName());
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        } else {
            System.out.println("Request cannot be processed");
        }
    }
}

public class DepartmentManagerHandler extends LeaveHandler {
    private static final int MAX_DAYS = 10;

    @Override
    public void handleRequest(LeaveRequest request) {
        if (request.getDays() <= MAX_DAYS) {
            System.out.println("Department Manager approved " + request.getDays() + " days leave for " + request.getEmployeeName());
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

public class HRHandler extends LeaveHandler {
    @Override
    public void handleRequest(LeaveRequest request) {
        System.out.println("HR approved " + request.getDays() + " days leave for " + request.getEmployeeName());
        // HR可以批准任意天数,但需要特殊审批流程
    }
}

// 构建责任链
public class LeaveApprovalChain {
    public static LeaveHandler buildChain() {
        TeamLeadHandler teamLead = new TeamLeadHandler();
        DepartmentManagerHandler manager = new DepartmentManagerHandler();
        HRHandler hr = new HRHandler();

        teamLead.setNextHandler(manager);
        manager.setNextHandler(hr);

        return teamLead;
    }
}

// 使用示例(Web框架中的过滤器链)
public class FilterChainDemo {
    public interface Filter {
        void doFilter(Request request, Response response, FilterChain chain);
    }

    public class AuthenticationFilter implements Filter {
        @Override
        public void doFilter(Request request, Response response, FilterChain chain) {
            if (request.getHeader("Authorization") != null) {
                System.out.println("Authentication passed");
                chain.doFilter(request, response);
            } else {
                response.setStatus(401);
                System.out.println("Authentication failed");
            }
        }
    }

    public class LoggingFilter implements Filter {
        @Override
        public void doFilter(Request request, Response response, FilterChain chain) {
            System.out.println("Request: " + request.getPath());
            chain.doFilter(request, response);
            System.out.println("Response status: " + response.getStatus());
        }
    }

    public class FilterChain {
        private List<Filter> filters = new ArrayList<>();
        private int index = 0;

        public void addFilter(Filter filter) {
            filters.add(filter);
        }

        public void doFilter(Request request, Response response) {
            if (index < filters.size()) {
                Filter filter = filters.get(index);
                index++;
                filter.doFilter(request, response, this);
            }
        }
    }
}

4.4 模板方法模式(Template Method)
模板方法模式定义算法的骨架,将某些步骤延迟到子类实现。

// 抽象模板
public abstract class DataProcessor {

    // 模板方法(final防止子类修改)
    public final void process() {
        readData();
        processData();
        writeData();
        if (needValidation()) {
            validate();
        }
    }

    // 具体方法(子类共享)
    protected void readData() {
        System.out.println("Reading data from source");
    }

    // 抽象方法(子类必须实现)
    protected abstract void processData();

    // 具体方法(可被子类覆盖)
    protected void writeData() {
        System.out.println("Writing data to destination");
    }

    // 钩子方法(子类可选覆盖)
    protected boolean needValidation() {
        return false;
    }

    protected void validate() {
        System.out.println("Validating data");
    }
}

// 具体子类
public class CsvDataProcessor extends DataProcessor {
    @Override
    protected void processData() {
        System.out.println("Processing CSV data: parsing columns, handling quotes");
    }

    @Override
    protected boolean needValidation() {
        return true;
    }

    @Override
    protected void validate() {
        System.out.println("Validating CSV format and data types");
    }
}

public class JsonDataProcessor extends DataProcessor {
    @Override
    protected void processData() {
        System.out.println("Processing JSON data: parsing objects, arrays");
    }

    @Override
    protected void writeData() {
        System.out.println("Writing JSON data to API endpoint");
    }
}

// 使用示例(Spring中的模板方法)
// JdbcTemplate, RestTemplate, RedisTemplate 都使用了模板方法模式
public class JdbcTemplateExample {
    public void demo() {
        JdbcTemplate template = new JdbcTemplate(dataSource);

        // 模板方法 execute
        template.execute((PreparedStatementCallback<Object>) ps -> {
            // 用户只需实现具体逻辑
            return null;
        });
    }
}

4.5 状态模式(State)—— 对象状态机
状态模式允许对象在内部状态改变时改变其行为。

// 状态接口
public interface OrderState {
    void pay(Order order);
    void cancel(Order order);
    void ship(Order order);
    void deliver(Order order);
}

// 具体状态
public class PendingState implements OrderState {
    @Override
    public void pay(Order order) {
        System.out.println("Payment received, order is now PAID");
        order.setState(new PaidState());
    }

    @Override
    public void cancel(Order order) {
        System.out.println("Order cancelled");
        order.setState(new CancelledState());
    }

    @Override
    public void ship(Order order) {
        System.out.println("Cannot ship unpaid order");
        throw new IllegalStateException("Order not paid");
    }

    @Override
    public void deliver(Order order) {
        System.out.println("Cannot deliver unpaid order");
        throw new IllegalStateException("Order not paid");
    }
}

public class PaidState implements OrderState {
    @Override
    public void pay(Order order) {
        System.out.println("Order already paid");
    }

    @Override
    public void cancel(Order order) {
        System.out.println("Order cancelled, refund initiated");
        order.setState(new CancelledState());
    }

    @Override
    public void ship(Order order) {
        System.out.println("Order shipped");
        order.setState(new ShippedState());
    }

    @Override
    public void deliver(Order order) {
        System.out.println("Cannot deliver, order not shipped yet");
        throw new IllegalStateException("Order not shipped");
    }
}

public class ShippedState implements OrderState {
    @Override
    public void pay(Order order) {
        System.out.println("Order already paid");
    }

    @Override
    public void cancel(Order order) {
        System.out.println("Cannot cancel shipped order");
        throw new IllegalStateException("Order already shipped");
    }

    @Override
    public void ship(Order order) {
        System.out.println("Order already shipped");
    }

    @Override
    public void deliver(Order order) {
        System.out.println("Order delivered");
        order.setState(new DeliveredState());
    }
}

public class DeliveredState implements OrderState {
    @Override
    public void pay(Order order) {
        System.out.println("Order already paid");
    }

    @Override
    public void cancel(Order order) {
        System.out.println("Cannot cancel delivered order");
        throw new IllegalStateException("Order already delivered");
    }

    @Override
    public void ship(Order order) {
        System.out.println("Order already delivered");
    }

    @Override
    public void deliver(Order order) {
        System.out.println("Order already delivered");
    }
}

public class CancelledState implements OrderState {
    @Override
    public void pay(Order order) {
        System.out.println("Cannot pay cancelled order");
        throw new IllegalStateException("Order cancelled");
    }

    @Override
    public void cancel(Order order) {
        System.out.println("Order already cancelled");
    }

    @Override
    public void ship(Order order) {
        System.out.println("Cannot ship cancelled order");
        throw new IllegalStateException("Order cancelled");
    }

    @Override
    public void deliver(Order order) {
        System.out.println("Cannot deliver cancelled order");
        throw new IllegalStateException("Order cancelled");
    }
}

// 上下文
public class Order {
    private OrderState state;
    private String orderId;

    public Order(String orderId) {
        this.orderId = orderId;
        this.state = new PendingState();  // 初始状态
    }

    public void setState(OrderState state) {
        this.state = state;
        System.out.println("Order " + orderId + " state changed to: " + state.getClass().getSimpleName());
    }

    public void pay() {
        state.pay(this);
    }

    public void cancel() {
        state.cancel(this);
    }

    public void ship() {
        state.ship(this);
    }

    public void deliver() {
        state.deliver(this);
    }
}

// 使用示例
public class OrderStateDemo {
    public static void main(String[] args) {
        Order order = new Order("ORD-001");

        // 正常流程
        order.pay();      // Payment received, order is now PAID
        order.ship();     // Order shipped
        order.deliver();  // Order delivered

        // 异常流程
        Order order2 = new Order("ORD-002");
        order2.cancel();  // Order cancelled
        order2.pay();     // Exception: Cannot pay cancelled order
    }
}

来源:
https://aescc.cn/

相关文章
|
2月前
|
运维 Java 测试技术
程序员必备的十大技能(进阶版)之性能调优与故障排查(四)
教程来源 https://aescc.cn/ 本节系统介绍Java应用性能分析与稳定性保障核心实践:涵盖Arthas诊断、火焰图性能剖析、全链路压测方法论及JMeter实战、混沌工程故障注入(ChaosBlade),并复盘Full GC与数据库死锁两大典型故障案例,助力高效定位与解决线上性能问题。
|
2月前
|
存储 程序员 调度
程序员必备的十大技能(进阶版)之底层计算机原理(一)
教程来源 http://zlpow.cn/ 本文深入计算机底层原理,涵盖体系结构、CPU微架构、内存层次、I/O、操作系统、汇编、编译链接等十大维度,揭示代码如何在硬件上高效运行,助开发者写出更可靠、高性能的程序。
|
2月前
|
存储 数据可视化 程序员
程序员进阶工程师必备的十大技能之业务深度理解与建模能力(三)
教程来源 https://qcycj.cn/ 本文介绍业务建模的三大工程实践:①建模文档化——用代码、注释与状态图清晰表达订单等核心概念与规则;②模型验证——通过单元测试保障业务规则正确性;③数据库映射——借助Repository模式实现领域模型与持久化的解耦。强调以业务为中心建模,让代码成为业务的精准数字映射。
|
2月前
|
人工智能 开发工具 开发者
学习AI Agent编程-第一天-MCP基础
本文精炼解析MCP(Model Context Protocol):它不是新模型,而是让AI Agent运行时动态增删工具的协议。通过MCP Server(工具实现)、Client(SDK封装)与Host(Agent应用)三组件协作,解决传统`bind_tools`静态绑定的局限。附完整可运行示例,助你快速掌握80%核心用法。(239字)
485 1
|
3月前
|
前端开发 JavaScript 程序员
初级程序员必备的十大技能之开发工具熟练使用(三)
教程来源 https://bncne.cn/ 浏览器开发者工具是前端调试核心利器,涵盖Elements(实时编辑DOM/CSS)、Console(日志、断点、DOM操作)、Sources(多类型断点与作用域调试)、Network(请求分析与模拟)、Performance(性能指标与火焰图)及Application(存储管理)六大面板,全面提升开发效率。
|
3月前
|
前端开发 程序员 开发工具
初级程序员必备的十大技能之开发工具熟练使用(四)
教程来源 https://tmywi.cn/ VS Code深度集成Git:快捷键操作、冲突可视化解决;GitLens增强代码溯源与历史追踪;配合高效命令行别名与撤销技巧;辅以Node/前端多维调试方案,全面提升开发效能。
|
2月前
|
Ubuntu Linux KVM
虚拟机使用教程大全(一)
教程来源 https://tmywi.cn/ 虚拟机技术已成IT从业者必备技能。本文聚焦“使用”而非搭建,涵盖资源调优、网络配置、快照备份、性能监控与故障排查等30+实用章节,兼容VMware/VirtualBox/KVM,含100+命令示例与实战技巧。
|
2月前
|
人工智能 Cloud Native 安全
QECon2026 深圳站丨云原生专家团拆解 AI Agent 工程化落地的 4 个关键环节
5 月 22 - 23 日,QECon 全球软件质量&效能大会落地深圳湾万丽酒店。阿里云云原生专家团将带来 4 场高密度实战分享,逐一拆解企业 AI Agent 落地痛点,欢迎您现场参会!
|
2月前
|
运维 监控 程序员
程序员必备的十大技能(进阶版)之性能调优与故障排查(三)
教程来源 https://bgnno.cn/ 本节系统讲解网络与数据库性能问题排查:涵盖TCP连接状态分析、TIME_WAIT优化、延迟诊断、连接池配置;以及慢查询定位、索引失效识别、事务锁监控和连接池调优,助力高效定位并解决生产环境常见瓶颈。