谈谈你如何理解设计模式这一概念?
设计模式是软件工程中的一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。它们是在某种情况下对问题的一种解决方案。设计模式不是可以直接转化成代码的类或者包,而是在特定情况下解决问题的一种模板。
设计模式的价值在于提供了一种通用的解决方案框架,可以应用于常见的设计问题中,避免陷入具体问题的具体解决方案中,提高了代码的可复用性、可维护性和通信效率。它们还有助于标准化开发过程,因为设计模式是多数开发者熟悉的,因此可以作为团队成员之间的共同语言。
设计模式通常被分为三大类:
-
创建型模式:涉及到对象的创建机制,帮助创建对象时同时隐藏创建逻辑,而不是使用new直接实例化对象。这些模式提供了创建对象的最佳方式。例如,单例模式(Singleton)保证一个类仅有一个实例,并提供一个访问它的全局访问点。
-
结构型模式:关注类和对象的组合,继承的替代方案,用于将接口和实现分离开来帮助我们得到更大的结构。例如,适配器模式(Adapter)可以让不兼容的接口通过一定的转换能够一起工作。
-
行为型模式:关注对象之间的通信,这些模式提供了增强对象间责任划分和算法封装的方法。例如,观察者模式(Observer)定义了对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。
举个例子,假设我们正在开发一个文档编辑器,并希望在用户执行操作时提供撤销功能。在这种情况下,我们可以使用命令模式(Command)来设计这个功能。我们将每一个执行的动作都封装成一个命令对象,包含执行操作的具体逻辑。这样,我们就可以维护一个命令历史记录,执行撤销操作时,我们从历史记录中取出最后一个命令并执行它的“撤销”方法,这样就可以达到撤销操作的目的。
设计模式主要可以分为哪些类别?
设计模式通常可以分为三类:
-
创建型模式(Creational Patterns): 这类模式关注如何创建对象,它们提供了一种在创建对象的时候隐藏创建逻辑的方式。这样,你可以减少系统中在代码中直接使用
new操作符的地方,使系统更易于维护和扩展。一些常见的创建型模式包括:- 单例模式(Singleton):确保一个类只有一个实例,并提供一个全局访问点。
- 工厂方法模式(Factory Method):提供一个创建对象的接口,但由子类决定实例化的类是哪一个。
- 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
-
结构型模式(Structural Patterns): 这类模式关注如何组织不同的对象和类来形成更大的结构,并提供了在不改变各个对象和类的设计的情况下,将它们组合在一起的方法。常见的结构型模式包括:
- 适配器模式(Adapter):将一个类的接口转换成客户期望的另一个接口。
- 桥接模式(Bridge):将抽象部分与其实现部分分离,使它们都可以独立地变化。
- 装饰器模式(Decorator):动态地给一个对象添加一些额外的职责,就增加功能来说,装饰器模式比生成子类更为灵活。
-
行为型模式(Behavioral Patterns): 这类模式关注对象之间的通信,它们提供了对象如何交互和如何分配职责的方法。常见的行为型模式包括:
- 观察者模式(Observer):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
- 状态模式(State):允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。
- 策略模式(Strategy):定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
这些模式在软件开发中被广泛应用,它们提供了一种有效的代码重用和组织的方式,也有助于提高代码的可读性和可维护性。
在JDK中,你能想到哪些设计模式的实际应用?
Java Development Kit (JDK) 是 Java 语言的核心库,其中大量使用了设计模式。这些设计模式被用于提高库的灵活性、可维护性和可扩展性。以下是 JDK 中一些常见的设计模式示例:
-
单例模式(Singleton Pattern):
java.lang.Runtime类使用了单例模式。这个类每次调用getRuntime()方法时,都会返回相同的 Runtime 对象,保证 JVM 内唯一实例。
-
工厂方法模式(Factory Method Pattern):
java.util.Calendar、ResourceBundle和NumberFormat等类的getInstance()方法,都是工厂方法,返回的是其各自类的子类的对象。
-
抽象工厂模式(Abstract Factory Pattern):
javax.xml.parsers.DocumentBuilderFactory和javax.xml.transform.TransformerFactory是抽象工厂模式的例子。
-
适配器模式(Adapter Pattern):
java.util.Arrays的asList()方法和java.io.InputStreamReader(将InputStream转换为Reader)都是适配器模式的实现。
-
装饰器模式(Decorator Pattern):
- Java I/O 标准库中,例如
java.io.BufferedInputStream和java.io.DataInputStream,使用装饰器模式增加了更多的功能。
- Java I/O 标准库中,例如
-
观察者模式(Observer Pattern):
java.util.Observer接口和java.util.Observable类就是 JDK 对观察者模式的实现。虽然在 JDK 9 中它们被标记为过时(Deprecated),因为引入了更现代的java.beans包中的PropertyChangeListener。
-
代理模式(Proxy Pattern):
java.lang.reflect.Proxy类和java.rmi.*包中的远程代理的实现。
-
状态模式(State Pattern):
javax.faces.lifecycle.LifeCycle在 JavaServer Faces(JSF)中使用了状态模式。
-
策略模式(Strategy Pattern):
- 在
java.util.Comparator接口中体现,常用于Collections.sort()和Arrays.sort()方法中,允许用户指定排序的策略。
- 在
-
模板方法模式(Template Method Pattern):
java.util.Collections中的sort()方法就使用了模板方法。它定义了排序的算法骨架,并将实际的比较操作留给用户去自定义。
-
命令模式(Command Pattern):
java.lang.Runnable接口可以看作是命令模式的体现,用于执行与线程分离的操作。
-
迭代器模式(Iterator Pattern):
java.util.Iterator接口是迭代器模式的直接实现,用于遍历集合元素。
这些只是一部分例子。JDK 中使用了许多其他的设计模式,且在新的 Java 版本中会继续使用新的设计模式。设计模式的使用是为了解决特定问题的一种最佳实践,JDK 的设计充分展示了这一点。
Spring框架中运用了哪些设计模式?请举例说明。
Spring框架是一个广泛使用设计模式的开源Java平台,它利用了设计模式来实现其轻量级、松耦合的代码基础。Spring中使用的一些常见设计模式包括:
-
单例模式(Singleton Pattern):
- Spring 容器中的 bean 默认是单例的。当你定义一个bean,并在整个容器中只创建一个实例时,这就使用了单例模式。
-
工厂模式(Factory Pattern):
- Spring 使用工厂模式通过 BeanFactory 和 ApplicationContext 来创建对象。
-
代理模式(Proxy Pattern):
- Spring AOP 功能底层就是使用代理模式来实现的。它通过 JDK 动态代理或 CGLIB 代理,在运行时创建对象的代理,并添加横切关注点。
-
模板方法模式(Template Method Pattern):
- Spring中的JdbcTemplate, HibernateTemplate等,都是模板方法模式的应用。这些类提供了一个模板方法来处理资源的打开和关闭,并让用户定义操作的具体行为。
-
适配器模式(Adapter Pattern):
- Spring MVC 中的 Controller 接口就使用了适配器模式。HandlerAdapter 用于适配不同类型的控制器。
-
装饰器模式(Decorator Pattern):
- 在Spring中,装饰器模式通常用于添加附加的功能,如通过装饰器为数据源添加连接池的功能。
-
观察者模式(Observer Pattern):
- Spring 事件处理就是观察者模式的一个例子。ApplicationContext 可以发布事件,而 Bean 可以定义为监听这些事件。
-
策略模式(Strategy Pattern):
- Spring 中的 Resou

最低0.47元/天 解锁文章
1938

被折叠的 条评论
为什么被折叠?



