持续总结中!2024年面试必问 20 道设计模式面试题(一)

一、什么是设计模式?请简述设计模式的分类。

设计模式是软件工程中的一种被广泛认可的解决方案模板,用于解决在软件设计过程中遇到的常见问题。它们是经验的总结,代表了一种在特定情况下被证明有效的解决方案。

设计模式的分类

设计模式通常分为以下三类:

  1. 创建型模式(Creational Patterns)

    • 这些模式提供了增加对象创建灵活性和重用性的方法,同时隐藏了对象创建的具体细节。
    • 主要包括:单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式等。
  2. 结构型模式(Structural Patterns)

    • 结构型模式关注于对象的组合,通过组合简单对象来构建复杂的结构,同时保持结构的灵活性和可扩展性。
    • 主要包括:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式等。
  3. 行为型模式(Behavioral Patterns)

    • 行为型模式专注于对象间的交互以及它们如何相互协作以完成复杂的任务。
    • 主要包括:策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式等。

每种设计模式都有其特定的使用场景和目的,它们帮助开发者避免重复发明轮子,同时提供了一种标准化的方法来解决常见的设计问题。设计模式的使用可以提高代码的可读性、可维护性和可扩展性。

二、解释“开闭原则”(Open-Closed Principle)。

开闭原则(Open-Closed Principle, OCP)是面向对象编程中的一个基本原则,由Bertrand Meyer提出,并被SOLID原则进一步推广。开闭原则的核心思想是:

  • 对扩展开放:软件实体(类、模块、函数等)应该对扩展开放,意味着当需要增加新功能时,应该允许通过添加新的代码来扩展现有的代码基础,而不是修改现有的代码。
  • 对修改封闭:软件实体应该对修改封闭,意味着在添加新功能时,不应该改变现有的代码。这样可以保持现有代码的稳定性和可靠性。

开闭原则的重要性:

  1. 降低风险:修改现有代码可能会引入新的错误,遵循开闭原则可以减少这种风险。
  2. 提高可维护性:当系统遵循开闭原则时,维护和更新系统变得更加容易,因为开发者可以专注于添加新代码而不是修改旧代码。
  3. 增强灵活性:系统更容易适应变化,因为新功能可以通过扩展来实现,而不影响现有的功能。
  4. 促进重用:遵循开闭原则的代码更容易被重用,因为它们被设计为可以轻松地扩展和集成到其他系统中。

如何实现开闭原则:

  1. 使用抽象和多态:通过定义抽象接口或基类,然后让子类实现这些接口或继承这些基类,可以在不修改现有代码的情况下扩展功能。
  2. 依赖倒置原则:高层模块不应该依赖于低层模块,两者都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。
  3. 使用设计模式:许多设计模式,如策略模式、工厂方法模式、装饰者模式等,都是实现开闭原则的有效方法。
  4. 插件架构:设计系统以支持插件,这样可以通过添加新的插件来扩展功能,而不需要修改核心代码。
  5. 配置文件:使用配置文件来控制行为,而不是硬编码在代码中,这样可以通过更改配置而不是代码来适应变化。

示例:

假设你正在开发一个支付系统,该系统需要支持多种支付方式,如信用卡、PayPal、微信支付等。为了遵循开闭原则,你可以定义一个支付接口(PaymentMethod),然后为每种支付方式实现一个具体的类。当需要添加新的支付方式时,你只需要添加一个新的类实现PaymentMethod接口,而不需要修改现有的支付处理代码。

// 支付接口
interface PaymentMethod {void pay(double amount);
}// 信用卡支付实现
class CreditCardPayment implements PaymentMethod {public void pay(double amount) {// 信用卡支付逻辑}
}// PayPal支付实现
class PayPalPayment implements PaymentMethod {public void pay(double amount) {// PayPal支付逻辑}
}// 微信支付实现
class WeChatPayment implements PaymentMethod {public void pay(double amount) {// 微信支付逻辑}
}// 支付系统
class PaymentSystem {private List<PaymentMethod> paymentMethods = new ArrayList<>();public void addPaymentMethod(PaymentMethod paymentMethod) {paymentMethods.add(paymentMethod);}public void processPayment(double amount) {for (PaymentMethod paymentMethod : paymentMethods) {paymentMethod.pay(amount);}}
}

在这个示例中,PaymentSystem类对扩展开放,因为它可以通过addPaymentMethod方法添加新的支付方式,而不需要修改现有的processPayment方法。同时,它对修改封闭,因为添加新的支付方式不需要改变现有的代码。这样,支付系统就可以很容易地适应新的支付方式,同时保持现有代码的稳定性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/29120.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nginx的rewrite功能介绍

Rewrite 规则 ex:http://hostname/abc/abc.html –>http://hostname/abc.php?abc Rewrite对称URL Rewrite&#xff0c;即URL重写&#xff0c;就是把传入Web的请求重定向到其他URL的过程。 URL Rewrite最常见的应用是URL伪静态化&#xff0c;是将动态页面显示为静态页面方式…

4. Revit API UI 之 Ribbon(界面)

4. Revit API UI 之 Ribbon&#xff08;界面&#xff09; 第二篇中&#xff0c;我们提到了IExternalApplication&#xff0c;该接口需要实现两个方法&#xff1a;Revit启动时调用的OnStartup 方法&#xff0c;和Revit关闭时调研的OnShutdown 方法。文中还给了个例子&#xff0…

为什么idea总是提示将内部类设置为static

在写一些内部类的时候&#xff0c;Idea总是提示要设置为static&#xff0c;你知道为什么吗 在Java中&#xff0c;内部类可以被声明为static&#xff0c;这种内部类称为静态内部类&#xff08;Static Nested Class&#xff09;。静态内部类和非静态内部类有显著的区别&#xf…

2024年,计算机专业还值得选择吗

在2024年&#xff0c;计算机专业仍然是一个非常有前途和有价值的选择。计算机科学和技术的发展仍在不断加速&#xff0c;而全球范围内对技术人才的需求也在持续增长。以下是一些原因&#xff1a; 1. 高薪就业机会&#xff1a;计算机专业毕业生通常能够获得高薪的就业机会。技术…

mybatis之特殊SQL的执行

1.1模糊查询 尝试&#xff1a; //模糊查询用户 List<User> getUserByLike(Param("mohu") String mohu);<select id"getUserByLike" resultType"user">select * from user where username like %#{mohu}% </select>Test publ…

malloc和free函数在C语言中的作用

在C语言中&#xff0c;malloc和free函数是用于动态内存管理的关键函数。它们在程序运行时允许开发者根据需要动态地分配和释放内存。 malloc函数 malloc函数用于在堆&#xff08;heap&#xff09;上动态地分配指定大小的内存块&#xff0c;并返回一个指向该内存块的指针。如果…

普林斯顿大学教授终于把算法整理成图解笔记

普林斯顿大学教授终于把算法整理成图解笔记了&#xff01;&#xff01;&#xff01; 这些年虽然学到的编程知识越来越多&#xff0c;但是我对算法却始终没搞明白&#xff0c;直到偶然间看到这份笔记&#xff0c;我才认识到这些概念是多么简单。 对于很多刚入门的小伙伴来说&am…

如何让视频有高级感 高级感视频制作方法 高级感视频怎么剪 会声会影视频剪辑制作教程 会声会影中文免费下载

高质量视频通常具有清晰的画面、优质的音频和令人印象深刻的视觉效果。这篇文章来了解如何让视频有高级感&#xff0c;高级感视频制作方法。 一、如何让视频有高级感 要让视频有高级感&#xff0c;要注意以下几个要点&#xff1a; 1、剧本和故事性&#xff1a;一个好的剧本和…

建筑工程软件Revit中复杂大模型如何实现Web端轻量化?| HOOPS技术应用

建筑信息模型&#xff08; BIM&#xff09;技术在建筑工程中扮演着越来越重要的角色&#xff0c;而Autodesk Revit作为主流的BIM软件&#xff0c;被广泛应用于设计、施工和管理。然而&#xff0c;Revit生成的复杂大模型常常由于数据量庞大而难以直接在Web端展示和操作。这时&am…

MySQL 数据库 Navicat Premium 16.01 安装教程

MySQL 数据库 Navicat Premium 16.01 安装教程 目录 MySQL 数据库 Navicat Premium 16.01 安装教程前言安装步骤同意协议选择安装目录桌面快捷方式安装正在安装安装完成 步骤获取 前言 MySQL数据库管理用Navicat更加方便&#xff0c;可视化效果更好&#xff0c;今天给大家带来…

dp练习2

如何分析这个题目呢&#xff0c;要想着当前的最优解只和前面的最优解有关 class Solution { public:int numSquares(int n) {vector<int> f(n 1);for (int i 1; i < n; i) {int minn INT_MAX;for (int j 1; j * j < i; j) {minn min(minn, f[i - j * j]);}f[…

计算机组成原理(四)Cache存储器

文章目录 Cache存储器的基本原理cache命中率、平均访问时间、效率地址映射全相联映射直接映射组相联映射 查找算法cache 存储器替换策略cache 存储器-写操作策略习题 Cache存储器的基本原理 Cache是一种高速缓冲寄存器&#xff0c;是为了解决CPU和主存之间速度不匹配而采用的一…

线性表嘻嘻嘻

顺序存储结构 数组大小 #define MaxSize 50 存储类型&#xff08;整个顺序表的&#xff09; typedef struct{ElemType data[MaxSize];//ElemType看实际需求定int length; }SqList; 数组是用来存储元素的&#xff0c;length是长度。 这里的data可以是一个结构体数组&#…

树莓派4B_OpenCv学习笔记6:OpenCv识别已知颜色_运用掩膜

今日继续学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1&#xff1a; 学了这些OpenCv的理论性知识&#xff0c;不进行实践实在…

qss实现登录界面美化

qss实现登录界面美化 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);// 去掉头部this->setWindowFlag(Qt::FramelessWindowHint);// 去掉空白部分th…

深度学习训练——batch_size参数设置过大反而训练更耗时的原因分析

&#x1f4aa; 专业从事且热爱图像处理&#xff0c;图像处理专栏更新如下&#x1f447;&#xff1a; &#x1f4dd;《图像去噪》 &#x1f4dd;《超分辨率重建》 &#x1f4dd;《语义分割》 &#x1f4dd;《风格迁移》 &#x1f4dd;《目标检测》 &#x1f4dd;《暗光增强》 &a…

Matlab进阶绘图第60期—带伪彩图的曲面图

带伪彩图的曲面图是曲面图与伪彩图的组合。 其中&#xff0c;伪彩图与曲面图的颜色用于表示同一个特征。 由于伪彩图无遮挡但不直观&#xff0c;曲面图直观但有遮挡&#xff0c;而将二者组合&#xff0c;可以实现优势互补。 本期就来分享一下带伪彩图的曲面图的绘制方法&…

保护密码安全,探讨密码加盐及其在Go语言中的实现

介绍 在当今数字化时代&#xff0c;个人隐私和数据安全成为了人们关注的焦点之一。随着网络犯罪的不断增加&#xff0c;用户的密码安全性变得尤为重要。密码加盐作为一种常见的安全措施&#xff0c;被广泛应用于密码存储和认证系统中。本文将深入探讨密码加盐的概念、重要性以…

轻松掌握 ChatGPT:2024 年完全新手向导,让你从零到精通!

**ChatGPT 是什么** ChatGPT 是 OpenAI 开发的人工智能对话机器人&#xff0c;基于 GPT-3.5 模型构建。它通过自然语言交流&#xff0c;为用户提供信息查询和问题解答的服务。 **ChatGPT 的实用功能** - 能够帮助撰写视频剧本、招聘广告等&#xff0c;用户只需提供具体要求。 …

抖音a_bogus,mstoken全参数爬虫逆向补环境2024-06-15最新版

抖音a_bogus,mstoken全参数爬虫逆向补环境2024-06-15最新版 接口及参数 打开网页版抖音&#xff0c;右键视频进入详情页。F12打开控制台筛选detail&#xff0c;然后刷新网页&#xff0c;找到请求。可以发现我们本次的参数目标a_bogus。a_bogus有时长度为168有时为172&#xf…