框架专题:设计模式

embedded/2024/12/28 4:01:35/

1. 什么是设计模式

设计模式是一套经过验证的解决方案,用于解决软件开发中的常见问题。它不是具体的代码实现,而是一种可复用的思想和原则。设计模式的核心目标是提高代码的复用性、可扩展性和可维护性。

1.1 设计模式的三大特性

  • 可重用性:通过提取通用解决方案,避免重复开发。
  • 可读性:提供统一的术语和架构,方便团队协作。
  • 灵活性:增强代码的适应性,便于应对需求变更。

2. 设计模式的分类

根据《设计模式:可复用面向对象软件的基础》一书,设计模式可以分为以下三类:

2.1 创建型模式

创建型模式关注对象的实例化过程,旨在通过灵活的方式创建对象,而非直接实例化。常见的创建型模式包括:

  • 单例模式:确保一个类只有一个实例,并提供全局访问点。
  • 工厂方法模式:定义一个创建对象的接口,由子类决定实例化的类。
  • 抽象工厂模式:提供一个创建相关或依赖对象的接口,而无需指定它们的具体类。

2.2 结构型模式

结构型模式关注类和对象之间的组合,旨在通过灵活的方式构建复杂的结构。常见的结构型模式包括:

  • 适配器模式:将一个类的接口转换成客户端期望的接口。
  • 装饰者模式:动态地为对象增加功能。
  • 代理模式:为另一个对象提供代理以控制访问。

2.3 行为型模式

行为型模式关注对象之间的通信和职责划分。常见的行为型模式包括:

  • 观察者模式:定义对象间的一对多依赖,当一个对象状态改变时通知所有依赖对象。
  • 策略模式:定义一系列算法,并将它们封装起来,使它们可以互相替换。
  • 责任链模式:将请求沿着责任链传递,直到被某个对象处理。

3. 设计模式的实际应用场景

3.1 单例模式

场景:配置文件加载器、数据库连接池、日志记录器等。
示例

public class Singleton {private static Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

3.2 工厂方法模式

场景框架中的对象创建需要灵活扩展,例如MyBatis的SQLSession工厂。
示例

interface Product {void use();
}class ConcreteProductA implements Product {public void use() {System.out.println("Using Product A");}
}class ConcreteProductB implements Product {public void use() {System.out.println("Using Product B");}
}class Factory {public static Product createProduct(String type) {if (type.equals("A")) return new ConcreteProductA();else if (type.equals("B")) return new ConcreteProductB();return null;}
}

3.3 观察者模式

场景:事件驱动编程、消息通知系统等。
示例

import java.util.ArrayList;
import java.util.List;interface Observer {void update(String message);
}class ConcreteObserver implements Observer {private String name;public ConcreteObserver(String name) {this.name = name;}public void update(String message) {System.out.println(name + " received: " + message);}
}class Subject {private List<Observer> observers = new ArrayList<>();public void attach(Observer observer) {observers.add(observer);}public void notifyObservers(String message) {for (Observer observer : observers) {observer.update(message);}}
}

4. 设计模式框架中的应用

4.1 Spring 框架中的设计模式

  • 单例模式:Spring容器中的默认Bean是单例的。
  • 工厂方法模式BeanFactoryApplicationContext通过工厂模式创建和管理Bean。
  • 代理模式:AOP模块通过动态代理实现方法拦截。

4.2 MyBatis 框架中的设计模式

  • 工厂方法模式SqlSessionFactory用于创建SqlSession实例。
  • 代理模式:动态代理用于实现Mapper接口方法调用。
  • 模板方法模式BaseExecutor中定义了执行查询和更新的模板方法。

4.3 Hibernate 框架中的设计模式

  • 装饰者模式:Hibernate的Session对象对JDBC连接进行了封装和增强。
  • 策略模式:在查询缓存中选择不同的缓存策略。

5. 注意事项

5.1 合理选择设计模式

设计模式不是越多越好,而是需要根据实际场景和需求选择合适的模式。

5.2 避免过度设计

滥用设计模式可能导致代码复杂化,增加开发和维护成本。

5.3 理解模式之间的关系

一些设计模式是互补的,例如组合使用工厂方法模式和单例模式来管理全局实例。


6. 总结

设计模式是软件开发的重要工具,它不仅帮助我们解决常见问题,还为代码的长期可维护性提供了保障。在框架开发中,合理运用设计模式可以构建灵活且高效的系统架构。希望通过本文的讲解,您能对设计模式的核心思想和实际应用有更深入的理解。


http://www.ppmy.cn/embedded/149353.html

相关文章

【C++boost::asio网络编程】有关服务端退出方法的笔记

有关服务端退出方法的笔记 C风格的信号关闭boost::asio中的关闭方式 原来服务端的main函数如下 int main() {try{boost::asio::io_context ioc;Server s(ioc, 8888);ioc.run();}catch (const std::exception&){}return 0; }上面弊端在于缺乏好的退出机制&#xff0c;目前&a…

Android okhttp 网络链接各阶段监控

步骤 1: 添加依赖 在项目的 build.gradle 文件中&#xff0c;添加 OkHttp 依赖&#xff1a; implementation com.squareup.okhttp3:okhttp:4.11.0 步骤 2: 创建自定义的 EventListener 创建一个自定义的 EventListener 类&#xff1a; import android.util.Log import okht…

【漏洞复现】灵当CRM datapdf.php 任意文件读取漏洞

免责声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删除。本次测试仅供学习使用,如若非法他用,与平台和本文作…

Kafka、RocketMQ、RabbitMQ 对比

面试中对 Kafka 、 RocketMQ 、和 RabbitMQ 的对比是常见问题&#xff0c;可以从以下几个维度进行分析&#xff1a; 1️⃣ 基础概念 特性KafkaRocketMQRabbitMQ开发语言Java ScalaJavaErlang定位分布式流处理平台分布式消息中间件高效、可靠的消息队列消息模型Topic &#xf…

信息抽取(NLP)是什么技术有哪些应用?

信息抽取是将非结构化的信息转化为结构化信息的过程。一般应用于电商平均分析、知识图谱和大模型训练。 不同模型的对比 1. 规则模型 优点 简单直观:基于人工设定的规则,不需要大量的数据集进行训练,只要规则制定者对目标信息有清晰的理解即可开始构建。例如,对于一些具有…

taro中实现带有途径点的路径规划

前言 taro中实现带有途径点的路径规划 import React, {useState, useEffect} from "react"; import {View, Map, ScrollView} from tarojs/components import Taro, {useRouter} from tarojs/taro; import request from ../../request; import api from ../../reque…

Spring Boot 中 Map 的最佳实践

在Spring Boot中使用Map时&#xff0c;请遵循以下最佳实践: 1.避免在Controller中 直接使用Map。应该使用RequestBody 接收-个DTO对象或者 RequestParam接收参数&#xff0c;然后在Service中处 理Map。 2.避免在Service中 直接使用原始的Map。应该使用Autowired 注入-个专门…

elementUI——upload限制图片或者文件只能上传一个——公开版

最近在写后台管理系统时&#xff0c;遇到一个需求&#xff0c;就是上传图片&#xff0c;有且仅能上传一张。 效果图如下&#xff1a; 功能描述&#xff1a;上传图片时&#xff0c;仅支持单选&#xff0c;如果上传图片成功后&#xff0c;展示图片&#xff0c;并隐藏添加图片的…