摘要:常见设计模式面试题及其应用场景
自我介绍之后,第一个被问到的问题往往是关于设计模式。那么,设计模式到底是什么?
设计模式是针对设计问题的解决方案,旨在提高代码可重用性
常见设计模式面试题及其应用场景
自我介绍之后,第一个被问到的问题往往是关于设计模式。那么,设计模式到底是什么?
设计模式是针对设计问题的解决方案,旨在提高代码可重用性、灵活性和可维护性。快速、可重用、可维护和高质量的代码是每个程序员的目标,而设计模式是实现这些目标的有力工具。
那么,常见的设计模式有哪些?
常见的设计模式可以分为三类,分别为创建型模式,结构型模式和行为型模式。
一、创建型模式
创建型模式包括单例模式、工厂模式、抽象工厂模式、建造者模式和原型模式,它们可以解决对象创建过程中的各种问题,为我们提供灵活的对象创建机制。下面是具体的应用场景。
1. 单例模式
单例模式是一种创建型模式,它可以保证一个类只有一个实例,并提供一个全局访问点来访问这个实例。单例模式适用于以下场景:
- 全局唯一使用的类,例如数据库连接池、日志记录器。
- 管理共享资源的场景,例如对话框、窗口管理器。
下面是单例模式的示例代码。
```java public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } ```2. 工厂模式
工厂模式是一种创建型模式,它提供一个工厂方法来创建对象,而不需要暴露对象的创建逻辑。它常用于以下场景:
- 需要大量创建相似的对象的场景。
- 创建对象需要复杂的逻辑或条件判断的场景。
下面是工厂模式的示例代码。
```java public interface Product { void operation(); } public class ConcreteProductA implements Product { public void operation() { // 具体操作 } } public class ConcreteProductB implements Product { public void operation() { // 具体操作 } } public interface Factory { Product createProduct(); } public class ConcreteFactoryA implements Factory { public Product createProduct() { return new ConcreteProductA(); } } public class ConcreteFactoryB implements Factory { public Product createProduct() { return new ConcreteProductB(); } } ```二、结构型模式
结构型模式包括适配器模式、桥接模式、装饰器模式、组合模式、外观模式和享元模式,它们可以让不同对象之间更好地合作、组织和分离逻辑。下面是具体的应用场景。
1. 适配器模式
适配器模式是一种结构型模式,它可以将一个类的接口转换成客户端所期望的另一个接口。适配器模式适用于以下场景:
- 需要复用一些现有的类,但是它们的接口与所需接口不匹配的场景。
- 需要透明地使用一个类,但是该类不符合客户端的接口要求的场景。
下面是适配器模式的示例代码。
```java public interface Target { void request(); } public class Adaptee { public void specificRequest() { // 具体请求 } } public class Adapter implements Target { private Adaptee adaptee = new Adaptee(); public void request() { adaptee.specificRequest(); } } ```2. 装饰器模式
装饰器模式是一种结构型模式,它可以在不改变对象自身逻辑的情况下,动态地扩展对象的功能。装饰器模式适用于以下场景:
- 需要动态地增加或删除对象的某些功能的场景。
- 需要动态地为对象增加一些额外的行为的场景。
下面是装饰器模式的示例代码。
```java public interface Component { void operation(); } public class ConcreteComponent implements Component { public void operation() { // 具体操作 } } public abstract class Decorator implements Component { protected Component component; public Decorator(Component component) { this.component = component; } public void operation() { component.operation(); } } public class ConcreteDecoratorA extends Decorator { public ConcreteDecoratorA(Component component) { super(component); } public void operation() { super.operation(); // 继续添加装饰操作 } } public class ConcreteDecoratorB extends Decorator { public ConcreteDecoratorB(Component component) { super(component); } public void operation() { super.operation(); // 继续添加装饰操作 } } ```三、行为型模式
行为型模式包括责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式,它们可以更好地组织对象之间的关系,使得系统更加灵活和易于维护。下面是具体的应用场景。
1. 观察者模式
观察者模式是一种行为型模式,它定义了一种一对多的依赖关系,一个对象发生改变时,所有依赖它的对象都会自动收到通知并更新。观察者模式适用于以下场景:
- 一个对象状态改变需要同时改变其他对象的状态的场景。
- 当一个对象需要通知其他对象,但是不希望和被通知的对象建立紧密的耦合关系的场景。
下面是观察者模式的示例代码。
```java public interface Observer { void update(); } public class ConcreteObserver implements Observer { public void update() { // 具体更新操作 } } public interface Subject { void attach(Observer observer); void detach(Observer observer); void notifyObservers(); } public class ConcreteSubject implements Subject { private List2. 命令模式
命令模式是一种行为型模式,它将请求封装成对象,使得可以用不同的请求来进行参数化和具体化,同时可以将请求存储在队列中、记录日志、撤销操作等。命令模式适用于以下场景:
- 需要将请求发送给不同的接收者,而希望将请求本身和接收者解耦的场景。
- 需要支持撤销操作、排队操作等高级功能的场景。
下面是命令模式的示例代码。
```java public interface Command { void execute(); } public class ConcreteCommand implements Command { private Receiver receiver; public ConcreteCommand(Receiver receiver) { this.receiver = receiver; } public void execute() { receiver.action(); } } public class Receiver { public void action() { // 具体操作 } } public class Invoker { private Command command; public void setCommand(Command command) { this.command = command; } public void executeCommand() { command.execute(); } } ```在面试过程中,设计模式是一个难点,知道设计模式的概念和应用场景是一方面,更重要的是要能够灵活运用设计模式解决实际问题。希望本文提供的设计模式面试题及应用场景能够对读者有所帮助,祝大家在面试中取得好成绩!