设计模式:完结-->设计模式总结

设计模式深度解析:从阿里/字节实战看设计模式的选择与演进

一、设计模式的优缺点总结

1.1 三大类设计模式全景分析

创建型模式
解耦创建逻辑
产品族创建
复杂对象构造
克隆对象
全局唯一实例
创建型模式
+工厂方法(Factory Method)
+抽象工厂(Abstract Factory)
+建造者(Builder)
+原型(Prototype)
+单例(Singleton)
工厂方法
抽象工厂
建造者
原型
单例

优点总结

  1. 解耦对象创建:将对象创建与使用分离,提高系统灵活性
  2. 代码复用:封装创建逻辑,避免重复代码
  3. 控制复杂度:特别是建造者模式对复杂对象的构造过程进行封装
  4. 性能优化:原型模式避免重复初始化,单例减少资源消耗

缺点总结

  1. 类数量增加:引入额外接口和类,增加系统复杂度
  2. 过度设计风险:简单场景使用会增加不必要的复杂性
  3. 特定限制:如单例可能引起测试困难、全局状态问题
结构型模式
结构型模式
适配器
桥接
组合
装饰器
外观
享元
代理

优点总结

  1. 接口适配:适配器解决接口不兼容问题
  2. 抽象与实现分离:桥接模式提高扩展性
  3. 结构灵活性:组合模式构建树形结构,装饰器动态添加功能
  4. 性能优化:享元模式减少内存使用

缺点总结

  1. 性能开销:代理、装饰器等模式可能引入额外调用
  2. 设计复杂度:需要合理设计类之间的关系
  3. 理解成本:如桥接模式需要区分抽象和实现维度
行为型模式
Client Context Strategy 设置策略 执行算法 返回结果 反馈结果 Client Context Strategy

优点总结

  1. 算法封装:策略模式封装可互换的算法
  2. 对象间解耦:观察者模式实现松耦合通信
  3. 流程控制:模板方法定义算法骨架
  4. 扩展性:访问者模式便于添加新操作

缺点总结

  1. 通信开销:观察者可能引起意外更新链
  2. 复杂度:如访问者模式破坏封装性
  3. 过度抽象:简单流程使用模板方法可能过度设计

1.2 大厂实战中的模式权衡

阿里电商系统案例

  • 订单创建使用建造者模式处理复杂参数
  • 支付系统采用策略模式支持多种支付方式
  • 商品推荐使用观察者模式实现实时更新
// 订单建造者示例
public class OrderBuilder {
    private String orderId;
    private List<OrderItem> items;
    private Payment payment;
    
    public OrderBuilder withOrderId(String orderId) {
        this.orderId = orderId;
        return this;
    }
    
    public OrderBuilder withItems(List<OrderItem> items) {
        this.items = items;
        return this;
    }
    
    public Order build() {
        // 复杂校验和构建逻辑
        return new Order(orderId, items, payment);
    }
}

字节跳动推荐系统案例

  • 推荐算法使用策略模式动态切换
  • 内容处理采用责任链模式进行多级过滤
  • 用户行为分析使用访问者模式统计各类指标

二、如何选择合适的设计模式

2.1 设计模式选择方法论

问题分析
创建对象?
创建型模式
组织类结构?
结构型模式
对象交互?
行为型模式
简单工厂/工厂方法/抽象工厂
适配/组合/装饰
策略/观察者/模板方法

2.2 典型场景模式选择指南

场景1:对象创建复杂
  • 建造者模式:当对象构造需要多个步骤或复杂校验时
// 字节跳动广告投放配置
AdCampaign campaign = new AdCampaignBuilder()
    .withName("双十一促销")
    .withBudget(100000)
    .withTargeting(targeting)
    .withCreatives(creatives)
    .build();
场景2:算法需要动态切换
  • 策略模式:当系统需要在运行时选择不同算法变体时
// 阿里支付路由
PaymentStrategy strategy = PaymentStrategyFactory.getStrategy(paymentType);
strategy.pay(amount);
场景3:跨组件通信
  • 观察者模式:当对象状态变化需要通知多个其他对象时
// 商品库存通知
product.addStockObserver(new InventoryService());
product.addStockObserver(new RecommendationEngine());
product.setStock(100); // 自动通知观察者

2.3 设计模式组合应用

电商促销系统案例

促销活动
+应用策略(订单)
«interface»
折扣策略
+计算折扣()
满减策略
+计算折扣()
促销工厂
+创建策略(类型)

代码实现

// 策略模式+工厂模式组合
public class PromotionService {
    private PromotionStrategyFactory factory;
    
    public Order applyPromotion(Order order, String promotionType) {
        PromotionStrategy strategy = factory.createStrategy(promotionType);
        return strategy.apply(order);
    }
}

三、设计模式的未来发展趋势

3.1 云原生时代的设计模式演进

服务网格中的模式应用

Client Sidecar Service 请求 代理调用 响应 返回结果 代理模式+装饰器模式 Client Sidecar Service

趋势分析

  1. Sidecar模式:代理模式在服务网格中的新形态
  2. Operator模式:将领域知识编码为Kubernetes控制器
  3. Serverless模式:策略模式在函数计算中的新应用

3.2 响应式编程中的模式创新

Reactive设计模式

// 观察者模式的现代化实现
Flux<Order> orders = orderService.getOrders();
orders
    .filter(o -> o.getAmount() > 1000)
    .map(this::applyDiscount)
    .subscribe(this::processOrder);

新兴模式

  1. 反应式流模式:背压控制的观察者模式变体
  2. 事件溯源模式:状态管理的新思路
  3. CQRS模式:命令查询职责分离

3.3 AI时代的模式变革

ML系统中的设计模式

数据收集
特征工程
模型训练
模型部署
预测服务

创新方向

  1. 特征工厂模式:标准化特征计算流程
  2. 模型版本策略模式:AB测试不同模型版本
  3. 管道模式:组合多个数据处理步骤

四、大厂面试深度追问与解决方案

4.1 追问1:如何避免设计模式过度设计?

问题背景:在快速迭代的互联网项目中,如何平衡设计模式的使用与开发效率?

解决方案

  1. 渐进式设计
// 初始简单实现
public class PaymentService {
    public void pay(String type, BigDecimal amount) {
        if ("alipay".equals(type)) {
            // 直接实现
        } else if ("wechat".equals(type)) {
            // 直接实现
        }
    }
}

// 演进为策略模式
public interface PaymentStrategy {
    void pay(BigDecimal amount);
}

public class PaymentService {
    private PaymentStrategy strategy;
    
    public void setStrategy(PaymentStrategy strategy) {
        this.strategy = strategy;
    }
    
    public void pay(BigDecimal amount) {
        strategy.pay(amount);
    }
}
  1. 模式识别训练
  • 定期进行代码重构工作坊
  • 建立模式应用决策树
  • 实施代码审查中的模式讨论
  1. 复杂度评估指标
// 在以下情况考虑引入设计模式:
if (changeFrequency > THRESHOLD || 
    conditionalComplexity > ACCEPTABLE ||
    classResponsibility > SINGLE) {
    considerDesignPattern();
}
  1. 自动化质量门禁
  • 静态代码分析检测代码异味
  • 测试覆盖率保障模式正确性
  • 性能基准测试防止模式滥用

4.2 追问2:如何在微服务架构中应用设计模式?

问题背景:微服务架构下传统设计模式如何适应分布式环境?

解决方案

  1. 分布式模式变体
演进
传统单例
-static instance
+getInstance()
分布式单例
-分布式锁
+getClusterWideInstance()
  1. 服务通信模式
// 代理模式在API网关中的实现
@RestController
@RequestMapping("/api/product")
public class ProductApiGateway {
    @Autowired
    private ProductServiceClient client;
    
    @GetMapping("/{id}")
    public Product getProduct(@PathVariable String id) {
        // 可添加缓存、熔断等逻辑
        return client.getProduct(id);
    }
}
  1. 事件驱动架构
// 观察者模式的分布式实现
@EventListener
public void handleOrderCreated(OrderCreatedEvent event) {
    // 库存服务处理
    inventoryService.reduceStock(event.getProductId(), event.getQuantity());
    
    // 发券服务处理
    couponService.issueCoupon(event.getUserId());
}
  1. Saga模式
订单服务 支付服务 库存服务 创建支付 支付成功 扣减库存 扣减成功 扣减失败 取消支付 alt [库存充足] [库存不足] 订单服务 支付服务 库存服务

4.3 追问3:设计模式如何适应领域驱动设计(DDD)?

问题背景:在DDD架构中如何合理运用设计模式?

解决方案

  1. 分层架构中的模式应用
DTO
命令
仓储接口
用户接口层
应用层
领域层
基础设施层
  • 工厂模式:复杂聚合根的创建
public class OrderFactory {
    public Order createOrder(List<OrderItem> items, Customer customer) {
        Order order = new Order(customer);
        items.forEach(order::addItem);
        order.validate();
        return order;
    }
}
  • 仓储模式:聚合根的持久化抽象
public interface OrderRepository {
    Order findById(OrderId id);
    void save(Order order);
}
  1. 领域模型中的模式
  • 策略模式:实现领域规则
public interface PricingStrategy {
    Money calculatePrice(Order order);
}

public class VIPPricingStrategy implements PricingStrategy {
    @Override
    public Money calculatePrice(Order order) {
        return order.getTotal().multiply(0.9);
    }
}
  • 规格模式:组合查询条件
public interface Specification<T> {
    boolean isSatisfiedBy(T candidate);
    Specification<T> and(Specification<T> other);
}

public class OrderSpecification implements Specification<Order> {
    // 实现细节
}
  1. 领域事件模式
public class Order {
    private List<DomainEvent> domainEvents = new ArrayList<>();
    
    public void cancel() {
        this.status = OrderStatus.CANCELLED;
        domainEvents.add(new OrderCancelledEvent(this.id));
    }
    
    public List<DomainEvent> getDomainEvents() {
        return Collections.unmodifiableList(domainEvents);
    }
}

五、设计模式在阿里/字节的最佳实践

5.1 高并发场景下的模式优化

缓存代理模式

public class CachedUserRepository implements UserRepository {
    private final UserRepository delegate;
    private final Cache cache;
    
    @Override
    public User findById(String id) {
        User user = cache.get(id);
        if (user == null) {
            user = delegate.findById(id);
            cache.put(id, user);
        }
        return user;
    }
}

异步观察者模式

public class AsyncEventBus {
    private final Executor executor;
    private final Map<Class<?>, List<Consumer<?>>> handlers = new ConcurrentHashMap<>();
    
    public <E> void registerHandler(Class<E> eventType, Consumer<E> handler) {
        handlers.computeIfAbsent(eventType, k -> new CopyOnWriteArrayList<>())
               .add(handler);
    }
    
    public <E> void publish(E event) {
        List<Consumer<?>> consumers = handlers.get(event.getClass());
        if (consumers != null) {
            consumers.forEach(consumer -> {
                executor.execute(() -> {
                    @SuppressWarnings("unchecked")
                    Consumer<E> handler = (Consumer<E>) consumer;
                    handler.accept(event);
                });
            });
        }
    }
}

5.2 设计模式在中间件中的应用

RPC框架中的代理模式

public class RpcProxy implements InvocationHandler {
    private final Class<?> serviceInterface;
    
    public static <T> T create(Class<T> interfaceClass) {
        return (T) Proxy.newProxyInstance(
            interfaceClass.getClassLoader(),
            new Class<?>[] {interfaceClass},
            new RpcProxy(interfaceClass));
    }
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) {
        // 构造RPC请求并发送
        return sendRpcRequest(method, args);
    }
}

消息队列的建造者模式

Message message = new MessageBuilder()
    .withTopic("order_created")
    .withKey(orderId)
    .withBody(order)
    .withDelay(5, TimeUnit.MINUTES)
    .build();
producer.send(message);

六、总结与展望

设计模式在大型互联网企业的应用呈现以下趋势:

  1. 分布式演进:传统模式适应云原生环境
  2. 反应式融合:与响应式编程理念结合
  3. 领域驱动:在DDD架构中发挥更大价值
  4. 性能优化:高并发场景下的模式变体
  5. 智能化方向:AI时代的模式创新

阿里/字节工程师的建议

  • 掌握模式本质而非死记硬背
  • 关注模式在分布式系统的演进
  • 平衡模式使用与简单设计
  • 持续重构优化模式应用
  • 学习新兴架构中的模式创新

设计模式作为软件设计的经验总结,随着技术发展不断演进。工程师应当深入理解其核心思想,灵活运用于实际场景,而非机械套用。在未来技术变革中,设计模式仍将是构建高质量软件系统的重要工具。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值