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

简介: 教程来源 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/

相关文章
|
8天前
|
人工智能 开发工具 iOS开发
Claude Code 新手完全上手指南:安装、国产模型配置与常用命令全解
Claude Code 是一款运行在终端环境中的 AI 编程助手,能够直接在命令行中完成代码生成、项目分析、文件修改、命令执行、Git 管理等开发全流程工作。它最大的特点是**任务驱动、终端原生、轻量高效、多模型兼容**,无需图形界面、不依赖 IDE 插件,能够深度融入开发者日常工作流。
2970 7
|
10天前
|
Shell API 开发工具
Claude Code 快速上手指南(新手友好版)
AI编程工具卷疯啦!Claude Code凭借任务驱动+终端原生的特性,成了开发者的效率搭子。本文从安装、登录、切换国产模型到常用命令,手把手带新手快速上手,全程避坑,30分钟独立用起来。
3071 20
|
23天前
|
人工智能 JSON 供应链
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
LucianaiB分享零成本畅用JVS Claw教程(学生认证享7个月使用权),并开源GeoMind项目——将JVS改造为科研与产业地理情报可视化AI助手,支持飞书文档解析、地理编码与腾讯地图可视化,助力产业关系图谱构建。
23567 15
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
|
4天前
|
人工智能 Linux BI
国内用 Claude Code 终于不用翻墙了:一行命令搞定,自动接 DeepSeek
JeecgBoot AI专题研究 一键脚本:Claude Code + JeecgBoot Skills + DeepSeek 全平台接入 一行命令装好 Claude Code + JeecgBoot Skills + DeepSeek 接入,无需翻墙使用 Claude Code,支持 Wind
1956 3
国内用 Claude Code 终于不用翻墙了:一行命令搞定,自动接 DeepSeek
|
10天前
|
人工智能 JSON BI
DeepSeek V4-Pro 接入 Claude Code 完全实战:体验、测试与关键避坑指南
Claude Code 作为当前主流的 AI 编程辅助工具,凭借强大的代码理解、工程执行与自动化能力深受开发者喜爱,但原生模型的使用成本相对较高。为了在保持能力的同时进一步降低开销,不少开发者开始寻找兼容度高、价格更友好的替代模型。DeepSeek V4 系列的发布带来了新的选择,该系列包含 V4-Pro 与 V4-Flash 两款模型,并提供了与 Anthropic 完全兼容的 API 接口,理论上只需简单修改配置,即可让 Claude Code 无缝切换为 DeepSeek 引擎。
2464 3
|
8天前
|
人工智能 安全 开发工具
Claude Code 官方工作原理与使用指南
Claude Code 不是传统代码补全工具,而是 Anthropic 推出的终端 AI 代理,具备代理循环、双驱动架构(模型+工具)、全局项目感知、6 种权限模式等核心能力,本文基于官方文档系统解析其工作原理与高效使用技巧。
1342 0
|
8天前
|
存储 Linux iOS开发
【2026最新】MarkText中文版Markdown编辑器使用图解(附安装包)
MarkText是一款免费开源、跨平台的Markdown编辑器,主打所见即所得实时预览,支持Windows/macOS/Linux。内置数学公式、流程图、代码高亮、多主题及PDF/HTML导出,是Typora的轻量免费替代首选。(239字)