jdk中用到的设计模式

设计模式在Java中的应用
结构型模式:适配器模式:用来把一个接口转化成另一个接口。java.util.Arrays#asList()javax.swing.JTable(TableModel)java.io.InputStreamReader(InputStream)java.io.OutputStreamWriter(OutputStream)javax.xml.bind.annotation.adapters.XmlAdapter#marshal()javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal()桥接模式:这个模式将抽象和抽象操作的实现进行了解耦,这样使得抽象和实现可以独立地变化。AWT (It provides an abstraction layer which maps onto the native OS the windowing support.)JDBC 组合模式使得客户端看来单个对象和对象的组合是同等的。换句话说,某个类型的方法同时也接受自身类型作为参数。javax.swing.JComponent#add(Component)java.awt.Container#add(Component)java.util.Map#putAll(Map)java.util.List#addAll(Collection)java.util.Set#addAll(Collection) 装饰者模式:动态的给一个对象附加额外的功能,这也是子类的一种替代方式。可以看到,在创建一个类型的时候,同时也传入同一类型的对象。这在JDK里随处可见,你会发现它无处不在,所以下面这个列表只是一小部分。java.io.BufferedInputStream(InputStream)java.io.DataInputStream(InputStream)java.io.BufferedOutputStream(OutputStream)java.util.zip.ZipOutputStream(OutputStream)java.util.Collections#checkedList|Map|Set|SortedSet|SortedMap 门面模式:给一组组件,接口,抽象,或者子系统提供一个简单的接口。java.lang.Classjavax.faces.webapp.FacesServlet 享元模式使用缓存来加速大量小对象的访问时间。java.lang.Integer#valueOf(int)java.lang.Boolean#valueOf(boolean)java.lang.Byte#valueOf(byte)java.lang.Character#valueOf(char)代理模式代理模式是用一个简单的对象来代替一个复杂的或者创建耗时的对象。java.lang.reflect.ProxyRMI创建模式抽象工厂模式抽象工厂模式提供了一个协议来生成一系列的相关或者独立的对象,而不用指定具体对象的类型。它使得应用程序能够和使用的框架的具体实现进行解耦。这在JDK或者许多框架比如Spring中都随处可见。它们也很容易识别,一个创建新对象的方法,返回的却是接口或者抽象类的,就是抽象工厂模式了。java.util.Calendar#getInstance()java.util.Arrays#asList()java.util.ResourceBundle#getBundle()java.sql.DriverManager#getConnection()java.sql.Connection#createStatement()java.sql.Statement#executeQuery()java.text.NumberFormat#getInstance()javax.xml.transform.TransformerFactory#newInstance()建造模式(Builder)定义了一个新的类来构建另一个类的实例,以简化复杂对象的创建。建造模式通常也使用方法链接来实现。java.lang.StringBuilder#append()java.lang.StringBuffer#append()java.sql.PreparedStatementjavax.swing.GroupLayout.Group#addComponent()工厂方法就是一个返回具体对象的方法。java.lang.Proxy#newProxyInstance()java.lang.Object#toString()java.lang.Class#newInstance()java.lang.reflect.Array#newInstance()java.lang.reflect.Constructor#newInstance()java.lang.Boolean#valueOf(String)java.lang.Class#forName()原型模式使得类的实例能够生成自身的拷贝。如果创建一个对象的实例非常复杂且耗时时,就可以使用这种模式,而不重新创建一个新的实例,你可以拷贝一个对象并直接修改它。java.lang.Object#clone()java.lang.Cloneable单例模式用来确保类只有一个实例。Joshua Bloch在Effetive Java中建议到,还有一种方法就是使用枚举。java.lang.Runtime#getRuntime()java.awt.Toolkit#getDefaultToolkit()java.awt.GraphicsEnvironment#getLocalGraphicsEnvironment()java.awt.Desktop#getDesktop()行为模式责任链模式通过把请求从一个对象传递到链条中下一个对象的方式,直到请求被处理完毕,以实现对象间的解耦。java.util.logging.Logger#log()javax.servlet.Filter#doFilter()命令模式将操作封装到对象内,以便存储,传递和返回。java.lang.Runnablejavax.swing.Action解释器模式这个模式通常定义了一个语言的语法,然后解析相应语法的语句。java.util.Patternjava.text.Normalizerjava.text.Format迭代器模式提供一个一致的方法来顺序访问集合中的对象,这个方法与底层的集合的具体实现无关。java.util.Iteratorjava.util.Enumeration中介者模式通过使用一个中间对象来进行消息分发以及减少类之间的直接依赖。java.util.Timerjava.util.concurrent.Executor#execute()java.util.concurrent.ExecutorService#submit()java.lang.reflect.Method#invoke()备忘录模式生成对象状态的一个快照,以便对象可以恢复原始状态而不用暴露自身的内容。Date对象通过自身内部的一个long值来实现备忘录模式。java.util.Datejava.io.Serializable空对象模式这个模式通过一个无意义的对象来代替没有对象这个状态。它使得你不用额外对空对象进行处理。java.util.Collections#emptyList()java.util.Collections#emptyMap()java.util.Collections#emptySet()观察者模式它使得一个对象可以灵活的将消息发送给感兴趣的对象。java.util.EventListenerjavax.servlet.http.HttpSessionBindingListenerjavax.servlet.http.HttpSessionAttributeListenerjavax.faces.event.PhaseListener 状态模式通过改变对象内部的状态,使得你可以在运行时动态改变一个对象的行为。java.util.Iteratorjavax.faces.lifecycle.LifeCycle#execute()策略模式使用这个模式来将一组算法封装成一系列对象。通过传递这些对象可以灵活的改变程序的功能。java.util.Comparator#compare()javax.servlet.http.HttpServletjavax.servlet.Filter#doFilter()模板方法模式让子类可以重写方法的一部分,而不是整个重写,你可以控制子类需要重写那些操作。java.util.Collections#sort()java.io.InputStream#skip()java.io.InputStream#read()java.util.AbstractList#indexOf()访问者模式提供一个方便的可维护的方式来操作一组对象。它使得你在不改变操作的对象前提下,可以修改或者扩展对象的行为。javax.lang.model.element.Element and javax.lang.model.element.ElementVisitorjavax.lang.model.type.TypeMirror and javax.lang.model.type.TypeVisitor
<think>嗯,用户现在想了解Spring和Spring Boot框架中使用的设计模式。从对话历史看,用户之前询问过大批量数据导出的技术方案,现在转向了设计模式的话题,可能是位后端开发工程师,正在研究框架底层设计。 用户提供的引用材料很有价值:引用[1]提到Spring Boot中9种设计模式,引用[3]具体说明了模板方法模式在JdbcTemplate中的应用。不过用户明确表示"上述引用仅供参考",需要我更全面地回答。值得注意用户特别强调"所有设计模式",说明需要系统性总结。 先梳理Spring框架的核心设计模式: - 单例模式是IoC容器的基础,Bean默认单例 - 工厂模式体现在BeanFactory体系 - 代理模式支撑了AOP的实现 - 观察者模式用于事件驱动机制 - 模板方法模式在JdbcTemplate等数据访问层广泛使用 再看Spring Boot特有的设计模式应用: - 自动配置利用了工厂方法模式 - Starter机制本质是外观模式 - 条件注解@Conditional是策略模式的变体 - 健康检查接口是组合模式的体现 需要特别注意用户可能混淆的概念:Spring Cloud属于微服务架构解决方案,其服务发现用到了装饰器模式,熔断器是状态模式的应用,但这不属于Spring Boot核心范畴。 在整理具体案例时,应该突出代码示例: 1. 代理模式用@Transactional注解展示最直观 2. 模板方法模式用JdbcTemplate的query()方法演示 3. 观察者模式用ApplicationEvent案例说明 最后要区分框架原生设计模式和用户代码可应用的设计模式。比如依赖注入本身不是经典GOF模式,但Spring实现了控制反转容器。 用户可能还想知道: - 为什么某些模式在框架中特别重要(如单例模式对性能的影响) - 如何在自己的Spring Boot项目中应用这些模式 - 设计模式如何解决框架扩展性问题 这需要准备具体场景的代码片段,比如用策略模式实现支付模块,用建造者模式构造复杂对象等。不过当前问题聚焦在框架内部实现,用户扩展应用可以作为后续问题。</think>以下是Spring框架和Spring Boot中核心设计模式的系统总结,结合具体实现和代码示例: --- ### 一、Spring框架核心设计模式 1. **工厂模式(Factory Pattern)** - **实现**:`BeanFactory` 和 `ApplicationContext` - **作用**:解耦对象创建过程 ```java ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); MyService service = context.getBean(MyService.class); ``` 2. **单例模式(Singleton Pattern)** - **实现**:Bean默认作用域(`@Scope("singleton")`) - **特点**:IoC容器管理单例生命周期[^1] 3. **代理模式(Proxy Pattern)** - **实现**:AOP动态代理(JDK动态代理/CGLIB) ```java @Transactional // 基于代理实现事务管理 public void updateData() { ... } ``` 4. **模板方法模式(Template Method)** - **案例**:`JdbcTemplate`、`RestTemplate` ```java jdbcTemplate.execute("UPDATE table SET status=1", (PreparedStatement ps) -> { ps.setInt(1, id); return ps.executeUpdate(); }); ``` 5. **观察者模式(Observer Pattern)** - **实现**:`ApplicationEvent` 和 `ApplicationListener` ```java // 自定义事件 class OrderEvent extends ApplicationEvent { ... } // 监听器 @Component class EventListener implements ApplicationListener<OrderEvent> { public void onApplicationEvent(OrderEvent event) { ... } } ``` 6. **策略模式(Strategy Pattern)** - **案例**:资源加载接口 `ResourceLoader` ```java Resource resource = new ClassPathResource("config.xml"); InputStream input = resource.getInputStream(); ``` --- ### 二、Spring Boot增强设计模式 1. **自动配置:工厂方法模式(Factory Method)** - **实现**:`@EnableAutoConfiguration` 和 `spring.factories` - **原理**:通过`AutoConfigurationImportSelector`加载配置类 2. **Starter机制:外观模式(Facade Pattern)** - **案例**:`spring-boot-starter-web` 封装Web依赖 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> ``` 3. **条件注解:策略模式变体** - **实现**:`@ConditionalOnClass`、`@ConditionalOnProperty` ```java @Bean @ConditionalOnMissingBean // 仅当缺失该Bean时创建 public DataSource dataSource() { ... } ``` 4. **组合模式(Composite Pattern)** - **案例**:健康检查端点 `/actuator/health` ```java @Component public class CustomHealthIndicator implements HealthIndicator { public Health health() { return Health.up().withDetail("service", "OK").build(); } } ``` --- ### 三、其他关键模式 | **设计模式** | **应用场景** | **代表类/注解** | |--------------------|--------------------------------|-----------------------------| | **建造者模式** | 复杂对象构造 | `RestTemplateBuilder` | | **适配器模式** | 兼容不同接口 | `HandlerAdapter` | | **装饰器模式** | 增强Bean功能 | `BeanPostProcessor` | | **责任链模式** | 过滤器链处理 | `FilterChain` in Spring Security | --- ### 四、模式应用对比 | **模式** | **Spring框架** | **Spring Boot** | |------------------|-------------------------------|-------------------------------| | **工厂模式** | `BeanFactory` | 自动配置类 (`@Configuration`) | | **单例模式** | Bean作用域管理 | Starter内置Bean | | **模板方法** | `JdbcTemplate.execute()` | `JpaRepository` 方法实现 | | **观察者模式** | 事件监听机制 | `ApplicationReadyEvent` | > **设计哲学**:Spring Boot通过"约定优于配置"原则,将经典设计模式封装在Starter和自动配置中,降低开发者直接使用模式的复杂度[^2]。 --- ### 五、代码案例解析 **策略模式在支付模块的应用**: ```java // 策略接口 public interface PaymentStrategy { void pay(double amount); } // 具体策略 @Component("creditCard") public class CreditCardPayment implements PaymentStrategy { ... } @Component("paypal") public class PaypalPayment implements PaymentStrategy { ... } // 调用方 @Service public class PaymentService { @Autowired private Map<String, PaymentStrategy> strategies; // 自动注入所有实现 public void processPayment(String type, double amount) { strategies.get(type).pay(amount); } } ``` --- ### 六、设计模式价值 1. **解耦性**:工厂模式分离对象创建与使用 2. **扩展性**:策略模式支持支付方式无缝扩展 3. **复用性**:模板方法统一数据库操作流程 4. **可维护性**:观察者模式简化事件处理逻辑 [^1]: Spring的单例模式由IoC容器管理,与传统单例实现不同 [^2]: Spring Boot的自动配置本质是工厂方法模式的升级 [^3]: 模板方法模式在数据访问层提供了标准化操作流程 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值