Java中有23种设计模式,主要分为三类:创建型模式、结构型模式和行为型模式。
创建型模式
创建型模式关注于对象的创建,提供了更灵活的对象创建方式。主要包括以下几种:
单例模式:确保一个类只有一个实例,并提供一个全局访问点。
工厂模式:包括简单工厂、工厂方法模式和抽象工厂模式。
建造者模式:通过多个简单的对象逐步构建成一个复杂的对象。
原型模式:通过复制现有的实例来创建新对象。
抽象工厂模式:创建相关或相互依赖的对象家族,而不需要明确指定具体类。
结构型模式
结构型模式涉及对象/类之间的关系,主要包括以下几种:
适配器模式:将一个类的接口转换成客户端希望的另一个接口。
装饰器模式:动态地给一个对象添加一些额外的职责。
代理模式:为其他对象提供一种代理以控制对这个对象的访问。
外观模式:提供一个统一的接口,用来访问子系统中的一群接口。
桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化。
组合模式:将对象组合成树形结构以表示部分-整体层次结构。
享元模式:通过共享已经创建的对象来减少内存使用和提高效率。
行为型模式
行为型模式涉及对象/类的行为、状态、流程,主要包括以下几种:
策略模式:定义一系列算法,并将每一个算法封装起来,使它们可以相互替换。
模板方法模式:定义一个操作中的算法的骨架,将算法的一些步骤延迟到子类中。
观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
迭代子模式:提供一种方法顺序访问一个聚合对象中各个元素, 而又无需暴露该对象的内部表示。
责任链模式:将请求发送到多个对象中的一个,这些对象共享响应职责。
命令模式:将一个请求或者操作封装到一个对象中。
备忘录模式:在不破坏封装的前提下,捕获和恢复对象的状态。
状态模式:允许一个对象在其内部状态改变时改变它的行为。
访问者模式:在不修改集合元素的前提下,为集合中的每个元素操作提供一个访问接口。
中介者模式:用一个中介对象来封装一系列的对象交互。
解释器模式:提供一个简单的语法分析机制,用于解释和执行字符串表达式。
-
什么是适配器模式?
适配器模式是一种结构型设计模式,它允许不兼容的对象一起工作。通过创建一个适配器类,将一个类的接口转换成另一个接口,使得原本由于接口不兼容而不能一起工作的类可以协同工作。
-
为什么需要适配器模式?
适配器模式用于解决接口不兼容的问题。当系统中存在一些现有的类,这些类的接口与你希望使用的接口不一致时,可以使用适配器模式来适配这些接口,使它们能够一起工作。
-
适配器模式与装饰器模式有什么区别?
适配器模式主要用于解决接口不兼容的问题,而装饰器模式则是在不改变原有对象的基础上,动态地给对象添加新的功能。适配器模式关注的是接口的转换,而装饰器模式关注的是功能的增强。
-
适配器模式有哪两种主要形式?
适配器模式有两种主要形式:类适配器和对象适配器。类适配器通过继承实现适配,而对象适配器通过组合实现适配。
-
如何实现一个类适配器?
要实现一个类适配器,首先定义一个适配器类,该类继承自目标接口并实现了源类的接口。然后在适配器类中,将目标接口的方法转换为源类的方法。示例如下:
java// 目标接口 public interface Target { void request(); } // 源类 public class Adaptee { public void specificRequest() { System.out.println("Specific Request"); } } // 类适配器 public class ClassAdapter extends Adaptee implements Target { @Override public void request() { specificRequest(); } }
-
如何实现一个对象适配器?
要实现一个对象适配器,首先定义一个适配器类,该类实现了目标接口并持有一个源类的引用。然后在适配器类中,将目标接口的方法转换为源类的方法。示例如下:
java// 目标接口 public interface Target { void request(); } // 源类 public class Adaptee { public void specificRequest() { System.out.println("Specific Request"); } } // 对象适配器 public class ObjectAdapter implements Target { private Adaptee adaptee; public ObjectAdapter(Adaptee adaptee) { this.adaptee = adaptee; } @Override public void request() { adaptee.specificRequest(); } }
-
适配器模式有哪些优缺点?
优点:提高了系统的灵活性和可复用性;缺点:可能会增加系统的复杂性,特别是在过度使用适配器的情况下。
-
什么时候使用适配器模式?
当系统需要使用一个现有的类,而这个类的接口与所需的接口不一致时,可以使用适配器模式来进行适配。例如,当需要在一个旧系统中使用新的接口时,或者当需要在不同的框架之间进行集成时。
-
如何在适配器模式中添加新的方法?
在适配器模式中,可以在适配器类中添加新的方法,以扩展适配器的功能。这些新的方法可以调用源类的方法,也可以是适配器类自己的方法。
-
适配器模式与桥接模式有什么区别?
桥接模式用于将抽象部分与实现部分分离,使它们可以独立变化。而适配器模式用于将一个接口转换为另一个接口,使得不兼容的接口可以一起工作。桥接模式关注的是抽象和实现的分离,而适配器模式关注的是接口的适配。