Java笔试面试题AI答之设计模式(1)
文章目录
- 1. 简述什么是设计模式 ?
- 2. 叙述常见Java设计模式分类 ?
- 3. Java 设计模式的六大原则 ?
- 4. 简述对 MVC 的理解, MVC 有什么优缺点?
- MVC 的三个核心部分:
- MVC 的优点:
- MVC 的缺点:
- 5. 简述什么是典型的软件三层结构?软件设计为什么要分层?
- 典型的软件三层结构
- 软件设计为什么要分层
1. 简述什么是设计模式 ?
设计模式(Design Patterns)是软件工程中一种广泛使用的概念,它代表了在特定上下文中解决常见设计问题的一种典型方式。设计模式是经验的总结,是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是久经考验的,被证明是有效的,并且可以被重复使用。
设计模式通常包含以下几个要素:
- 模式名称:一个简洁的、描述性的名字,用于标识设计模式。
- 问题:描述了在何种情况下应该使用设计模式,即设计模式的适用场景。
- 解决方案:详细描述了设计模式是如何解决问题的,包括类、对象以及它们之间的交互方式。
- 效果:描述了使用设计模式后带来的好处和可能引入的副作用。
设计模式主要分为三大类:
- 创建型模式(Creational Patterns):用于创建对象,特别是使用“工厂方法”模式、“抽象工厂”模式、“单例”模式、“建造者”模式、“原型”模式等,来创建对象实例。
- 结构型模式(Structural Patterns):用于处理类或对象的组合,如“适配器”模式、“桥接”模式、“组合”模式、“装饰器”模式、“外观”模式、“享元”模式、“代理”模式等,它们通过描述类或对象之间的静态关系来定义系统的结构。
- 行为型模式(Behavioral Patterns):用于描述类或对象之间如何交互以及职责的分配,如“策略”模式、“模板方法”模式、“观察者”模式、“迭代器”模式、“状态”模式、“职责链”模式、“命令”模式、“访问者”模式、“中介者”模式、“备忘录”模式、“解释器”模式等,它们通过描述类或对象之间的交互和通信来定义系统的行为。
使用设计模式可以帮助开发人员更好地理解、设计和实现软件,提高软件的可维护性、可扩展性和可重用性。同时,设计模式也是软件设计领域的一种交流语言,有助于团队成员之间的沟通和协作。
2. 叙述常见Java设计模式分类 ?
Java设计模式是面向对象程序设计中的一种可复用的解决方案,用于解决软件设计中常见的问题。这些模式在Java社区中非常流行,因为它们提供了一种标准的方式来构建灵活、可维护和可扩展的软件系统。设计模式大致可以分为以下几类:
-
创建型模式(Creational Patterns):
这类设计模式提供了一种在创建对象时隐藏创建逻辑的方式,而不是使用new运算符直接实例化对象。这样可以增加代码的灵活性和可重用性。常见的创建型模式包括:- 单例模式(Singleton):确保一个类只有一个实例,并提供一个全局访问点。
- 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪个类。
- 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
- 建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
- 原型模式(Prototype):通过复制现有的实例来创建新的实例。
-
结构型模式(Structural Patterns):
结构型模式关注于类和对象的组合。它们采用继承以外的方法来组合对象以获得更大的灵活性。结构型模式描述了如何将类或对象结合在一起形成更大的结构,同时保持结构的灵活和高效。常见的结构型模式包括:- 适配器模式(Adapter):将一个类的接口转换成客户端所期待的另一种接口形式。
- 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。
- 桥接模式(Bridge):将抽象部分与它的实现部分分离,使它们都可以独立地变化。
- 装饰器模式(Decorator):动态地给一个对象添加一些额外的职责。就扩展功能而言,装饰器模式比生成子类更为灵活。
- 外观模式(Facade):为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
- 组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
- 享元模式(Flyweight):运用共享技术有效地支持大量细粒度的对象。
-
行为型模式(Behavioral Patterns):
行为型模式不仅关注类和对象的组织,还关注它们之间的通信。这些模式描述了算法和对象间职责的分配。常见的行为型模式包括:- 模板方法模式(Template Method):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
- 策略模式(Strategy):定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。此模式让算法的变化独立于使用算法的客户。
- 状态模式(State):允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
- 观察者模式(Observer):定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
- 中介者模式(Mediator):用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
- 迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。
- 访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
- 命令模式(Command):将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
- 备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
- 责任链模式(Chain of Responsibility):为请求的发送者和接收者之间解耦提供了一种松散的耦合方式,使得多个对象都有机会处理这个请求,或者将这个请求传递给链上的下一个对象。
- 解释器模式(Interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
这些设计模式在Java及其他面向对象的编程语言中得到了广泛的应用,帮助开发者设计更加灵活、可维护和可扩展的软件系统。
3. Java 设计模式的六大原则 ?
Java 设计模式的六大原则,也被称为面向对象设计原则,是指导我们如何设计可维护、可扩展、可复用的软件系统的基本原则。这些原则帮助开发者在软件设计过程中做出更好的决策,减少设计错误,提高软件质量。以下是六大原则的具体内容:
-
单一职责原则(Single Responsibility Principle, SRP)
- 一个类应该仅有一个引起它变化的原因。即一个类应该负责一组相对独立的功能。如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。因此,应当遵守单一职责原则,将类的职责单一化。
-
开放-封闭原则(Open-Closed Principle, OCP)
- 软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。即软件实体在尽量不修改原有代码的基础上进行扩展。实现开放-封闭原则的关键是抽象化,通过抽象化,我们可以将系统的所有可能的行为抽象成一个抽象层,让系统依赖于抽象层,而不是依赖于具体的实现。
-
里氏替换原则(Liskov Substitution Principle, LSP)
- 子类型必须能够替换掉它们的基类型。即所有引用基类的地方必须能透明地使用其子类的对象。这要求子类在扩展父类的功能时,尽量不要改变父类原有方法的预期行为。
-
依赖倒置原则(Dependency Inversion Principle, DIP)
- 高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。即要针对接口编程,不要针对实现编程。依赖倒置原则可以减少类间的耦合性,提高系统的稳定性,降低并行开发引起的风险,提高代码的可读性和可维护性。
-
接口隔离原则(Interface Segregation Principle, ISP)
- 不应该强迫客户依赖于它们不使用的方法。即一个类对另一个类的依赖应该建立在最小的接口上。接口隔离原则要求我们将臃肿庞大的接口拆分成更小的和更具体的接口,让客户端需要多少接口就依赖多少接口,这样有助于我们构建一个松耦合的系统。
-
迪米特法则(Law of Demeter, LoD)
- 一个软件实体应当尽可能少地与其他实体发生相互作用。即一个对象应该对其他对象保持最少的了解。迪米特法则又称为最少知识原则,它要求我们在设计系统时,应该尽量减少对象之间的交互,如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。
这六大原则为面向对象设计提供了指导方针,帮助开发者设计出更加健壮、灵活和可维护的软件系统。
4. 简述对 MVC 的理解, MVC 有什么优缺点?
MVC(Model-View-Controller)是一种软件设计典范,用于将应用程序的输入逻辑、处理逻辑和显示逻辑分离,以使得它们能够互相独立地修改和扩展。MVC 模式最早由 Trygve Reenskaug 在1978年提出,被广泛应用于Web开发中,特别是在构建复杂的Web应用程序时。
MVC 的三个核心部分:
-
Model(模型):
- 负责管理应用程序的数据以及业务逻辑(如数据验证、计算等)。
- 模型接收来自视图的数据请求,处理数据后返回结果给视图或控制器。
- 它是应用程序的核心部分,通常与数据库或其他数据存储进行交互。
-
View(视图):
- 负责显示数据给用户。
- 视图从模型接收数据并生成用户界面,但不包含任何业务逻辑或处理逻辑。
- 视图通常是由HTML、CSS和JavaScript等技术构建的。
-
Controller(控制器):
- 负责接收用户的输入(如点击按钮、提交表单等),并将这些输入转化为对模型和视图的调用。
- 控制器是模型和视图之间的桥梁,它解释用户的请求,调用模型和视图去完成用户的需求。
MVC 的优点:
- 低耦合性:模型、视图和控制器之间的职责清晰分离,减少了系统组件之间的依赖,使得修改和扩展变得容易。
- 高内聚性:每个部分都专注于自己的职责,提高了代码的可读性和可维护性。
- 易于测试:由于模型和视图的分离,可以更容易地对它们进行单元测试。
- 支持并行开发:开发团队可以并行地开发模型、视图和控制器,提高了开发效率。
MVC 的缺点:
- 增加系统复杂性:对于小型项目,使用MVC可能会增加不必要的复杂性。
- 学习曲线:对于新手来说,理解MVC的概念和如何正确使用它可能需要一些时间。
- 调试困难:由于组件之间的交互,当出现问题时,可能需要跨越多个组件进行调试。
- 性能考虑:在某些情况下,由于额外的调用和层次,MVC架构可能会影响应用程序的性能。然而,这种影响通常可以通过优化和缓存来减轻。
总的来说,MVC 模式是一种强大的设计模式,它提供了清晰的代码结构,提高了应用程序的可维护性和可扩展性。然而,是否采用MVC模式取决于项目的具体需求和团队的实际情况。
5. 简述什么是典型的软件三层结构?软件设计为什么要分层?
典型的软件三层结构
典型的软件三层结构,也被称为三层架构(3-tier architecture),通常指的是将整个业务应用划分为三个主要层次:
-
界面层(User Interface Layer):
- 主要负责用户界面的展示,包括数据的显示和用户输入的接收。它是用户与系统交互的窗口,位于最外层(最上层),最接近用户。
- 界面层的设计应尽可能简单,以便用户无需培训即可方便地访问信息。
-
业务逻辑层(Business Logic Layer):
- 也称为应用层或中间件层,是系统架构中体现核心价值的部分。它主要负责业务规则的制定、业务流程的实现等与业务需求相关的逻辑处理。
- 所有的应用系统、应用逻辑、控制都在这一层,系统的复杂性也主要体现在这一层。
-
数据访问层(Data Access Layer):
- 主要负责数据库的管理,包括数据的存储、检索、更新和删除等操作。所有与数据有关的安全、完整性控制、数据的一致性、并发操作等都在这一层完成。
- 数据库服务器存储大量的数据信息和数据逻辑,是系统数据的基础。
软件设计为什么要分层
软件设计采用分层架构的原因主要有以下几点:
-
降低复杂度:通过将复杂的系统划分为多个更小、更专注的部分,可以显著降低系统的整体复杂度,使得每个层次都有明确的职责,从而更容易理解和维护。
-
提高可维护性:分层架构使得修改和扩展系统变得更加容易。如果需要修改某个功能,通常只需要关注并修改相应的层次,而不会影响到其他层次。
-
提高可重用性:分层架构有助于提高代码的可重用性。例如,数据访问层的代码可以在多个地方被重用,而不需要每次都编写新的代码。
-
提高灵活性:分层架构使得系统更加灵活,能够轻松应对变化。如果需要添加新的功能或修改现有功能,可以通过添加新的层次或修改现有层次来实现。
-
促进团队协作:分层架构有助于促进团队成员之间的协作。不同的团队可以专注于不同的层次,从而提高开发效率和质量。
-
标准化:通过分层,可以制定标准化的接口和协议,使得不同层次之间的交互更加规范和统一。
-
提高安全性:分层架构能够更严格地控制信息访问,通过在数据传输过程中采用数据加密技术,可以进一步降低信息失密的风险。
综上所述,软件设计采用分层架构是为了降低复杂度、提高可维护性、可重用性和灵活性,促进团队协作,实现标准化,并提高系统的安全性。这种设计模式在大型软件开发中尤为重要,能够帮助开发团队更好地应对复杂的业务需求和技术挑战。
答案来自文心一言,仅供参考