Java中有23种设计模式,主要分为三类:创建型模式、结构型模式和行为型模式。
创建型模式
创建型模式关注于对象的创建,提供了更灵活的对象创建方式。主要包括以下几种:
单例模式:确保一个类只有一个实例,并提供一个全局访问点。
工厂模式:包括简单工厂、工厂方法模式和抽象工厂模式。
建造者模式:通过多个简单的对象逐步构建成一个复杂的对象。
原型模式:通过复制现有的实例来创建新对象。
抽象工厂模式:创建相关或相互依赖的对象家族,而不需要明确指定具体类。
结构型模式
结构型模式涉及对象/类之间的关系,主要包括以下几种:
适配器模式:将一个类的接口转换成客户端希望的另一个接口。
装饰器模式:动态地给一个对象添加一些额外的职责。
代理模式:为其他对象提供一种代理以控制对这个对象的访问。
外观模式:提供一个统一的接口,用来访问子系统中的一群接口。
桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化。
组合模式:将对象组合成树形结构以表示部分-整体层次结构。
享元模式:通过共享已经创建的对象来减少内存使用和提高效率。
行为型模式
行为型模式涉及对象/类的行为、状态、流程,主要包括以下几种:
策略模式:定义一系列算法,并将每一个算法封装起来,使它们可以相互替换。
模板方法模式:定义一个操作中的算法的骨架,将算法的一些步骤延迟到子类中。
观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
迭代子模式:提供一种方法顺序访问一个聚合对象中各个元素, 而又无需暴露该对象的内部表示。
责任链模式:将请求发送到多个对象中的一个,这些对象共享响应职责。
命令模式:将一个请求或者操作封装到一个对象中。
备忘录模式:在不破坏封装的前提下,捕获和恢复对象的状态。
状态模式:允许一个对象在其内部状态改变时改变它的行为。
访问者模式:在不修改集合元素的前提下,为集合中的每个元素操作提供一个访问接口。
中介者模式:用一个中介对象来封装一系列的对象交互。
解释器模式:提供一个简单的语法分析机制,用于解释和执行字符串表达式。
-
什么是观察者模式?
- 答案:观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系。当一个对象的状态发生改变时,它的所有依赖者(观察者)都会收到通知并自动更新。简单来说,就像你订阅了一个新闻推送,每当有新新闻发布时,你会收到通知。
-
为什么需要观察者模式?
- 答案:观察者模式可以让对象间的耦合度降低,使得代码更灵活、更易于维护。例如,在天气预报应用中,当天气数据更新时,所有的显示设备(如手机、电脑等)都可以即时显示最新的天气信息,而不需要每个设备都去检查天气数据是否更新。
-
观察者模式有哪些角色?
- 答案:观察者模式主要有三个角色:主题(Subject)、观察者(Observer)和具体实现类。主题负责维护观察者的列表并在状态改变时通知它们;观察者是接收通知的对象;具体实现类则是主题和观察者的具体实现。
-
如何实现一个简单的观察者模式?
- 答案:可以通过定义主题接口和观察者接口来实现。主题接口包含添加、删除和通知观察者的方法;观察者接口包含更新方法。具体实现类分别实现这些接口,并在主题状态改变时调用通知方法。
-
什么时候使用观察者模式?
- 答案:当一个对象的状态变化需要通知多个其他对象时,可以使用观察者模式。例如,股票价格变动通知多个投资者、社交媒体上的新动态通知给所有关注者等。
-
观察者模式的优点是什么?
- 答案:观察者模式的优点包括松耦合、动态交互和多种订阅方式。它减少了对象之间的依赖,使得系统更容易扩展和维护。
-
观察者模式的缺点是什么?
- 答案:观察者模式的缺点包括通知机制开销大、观察者管理复杂以及可能的循环依赖问题。如果一个被观察者对象有很多的直接和间接的观察者,通知所有观察者可能会花费很多时间。
-
如何在Java中使用内置的观察者模式?
- 答案:Java内置了
java.util.Observable和java.util.Observer类来支持观察者模式。你可以创建一个继承自Observable的主题类和一个实现Observer接口的观察者类,然后通过调用addObserver和removeObserver方法来管理观察者。
- 答案:Java内置了
-
观察者模式与发布-订阅模式有什么区别?
- 答案:观察者模式和发布-订阅模式非常相似,但它们有不同的侧重点。观察者模式强调的是对象间的依赖关系和状态更新,而发布-订阅模式则更侧重于消息的传递和处理。可以说发布-订阅模式是观察者模式的一种具体实现形式。
-
你在实际开发中使用过观察者模式吗?
- 答案:在实际开发中,我使用过观察者模式来实现事件监听器。例如,在一个在线购物系统中,当用户下单成功时,系统会触发一系列事件,如发送邮件通知、更新库存等。通过观察者模式,我们可以方便地管理和扩展这些事件处理程序。
