.NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】

news2024/9/29 7:19:22

在这里插入图片描述

设计模式是软件工程中常用的解决特定问题的通用设计方法。它们提供了经过验证的解决方案,可用于解决在软件开发过程中经常遇到的一些常见问题。设计模式不是一种具体的编程语言特性或语法,而是一种通用的设计思想或模板,可以帮助开发人员设计出结构良好、易于理解、可扩展和可维护的软件系统。

在这里插入图片描述

设计模式原则
设计模式的使用基于一些设计原则,这些原则指导着软件开发人员在设计和实现软件系统时的决策和选择。其中一些重要的设计原则包括:

  1. 单一职责原则(Single Responsibility Principle,SRP):一个类应该只有一个引起变化的原因。换句话说,一个类应该只负责一项职责。

  2. 开闭原则(Open/Closed Principle,OCP):软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。这意味着在不修改现有代码的情况下,应该能够通过添加新的代码来扩展系统的功能。

  3. 里氏替换原则(Liskov Substitution Principle,LSP):子类型必须能够替换掉其父类型并且不影响程序的正确性。换句话说,派生类必须能够替换其基类使用。

  4. 依赖倒置原则(Dependency Inversion Principle,DIP):高层模块不应该依赖于低层模块,二者都应该依赖于抽象。抽象不应该依赖于具体实现,具体实现应该依赖于抽象。

  5. 接口隔离原则(Interface Segregation Principle,ISP):客户端不应该强制依赖于它不使用的接口。应该将不同的功能划分为独立的接口,并根据需要使用这些接口。

  6. 迪米特法则(Law of Demeter,LoD):一个对象应该对其他对象有尽可能少的了解。换句话说,一个对象不应该直接与太多其他对象进行交互,而应该通过少量的接口来实现。

使用设计模式的原因
使用设计模式的主要原因包括:

  • 提高代码的重用性:设计模式提供了经过验证的解决方案,可以帮助开发人员设计出可重用的代码,避免重复编写相似的代码。

  • 提高代码的可维护性:设计模式提供了一种结构良好的设计方法,可以使代码更易于理解、修改和维护。

  • 提高系统的扩展性:设计模式可以帮助开发人员设计出松耦合的软件系统,使得系统更易于扩展和修改。

  • 提高系统的性能:某些设计模式可以帮助开发人员优化代码,提高系统的性能和效率。

  • 降低软件开发成本:设计模式可以帮助开发人员更快地开发出高质量的软件,从而降低软件开发的成本和风险。

举个代码的例子来说明为什么要用设计模式

假设我们正在开发一个计算机游戏,其中有多种不同类型的角色(如玩家角色、敌人角色等),每种角色都有自己的能力和行为。我们需要根据角色类型创建相应的对象,并执行相应的操作。

在这种情况下,我们可以使用工厂模式来创建不同类型的角色对象,以及策略模式来处理不同角色的行为。这样可以使系统更加灵活、可扩展,并且易于维护。

using System;

// 角色接口
interface ICharacter
{
    void Display();
    void PerformAbility();
}

// 玩家角色
class Player : ICharacter
{
    public void Display()
    {
        Console.WriteLine("Displaying player character.");
    }

    public void PerformAbility()
    {
        Console.WriteLine("Performing player ability: Double Jump");
    }
}

// 敌人角色
class Enemy : ICharacter
{
    public void Display()
    {
        Console.WriteLine("Displaying enemy character.");
    }

    public void PerformAbility()
    {
        Console.WriteLine("Performing enemy ability: Shoot");
    }
}

// 角色工厂
class CharacterFactory
{
    public ICharacter CreateCharacter(string type)
    {
        switch (type)
        {
            case "Player":
                return new Player();
            case "Enemy":
                return new Enemy();
            default:
                throw new ArgumentException("Invalid character type.");
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        // 使用工厂创建角色对象
        CharacterFactory factory = new CharacterFactory();
        ICharacter player = factory.CreateCharacter("Player");
        ICharacter enemy = factory.CreateCharacter("Enemy");

        // 显示角色信息和执行能力
        player.Display();
        player.PerformAbility();

        enemy.Display();
        enemy.PerformAbility();
    }
}

我们使用了工厂模式(CharacterFactory类)来根据角色类型创建相应的角色对象,并且使用了策略模式(ICharacter接口)来处理不同角色的行为。这样,当我们需要添加新的角色类型时,只需要修改工厂类即可,而不需要修改现有的代码。这使得系统更加灵活和可扩展。

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

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

相关文章

Delphi 报错 Type androidx.collection.ArraySet is defined multiple times

Delphi 11 建立一个新的 Multi-Device Application 编译成app的时候报错 报错信息 [PAClient Error] Error: E7688 Unable to execute "E:\Program\Java\jdk1.8.0_301\bin\java.exe" -cp "e:\program\embarcadero\studio\22.0\bin\Android\r8-3.3.28.jar"…

【力扣 - 买卖股票的最佳时机】

题目描述 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的…

新的一年,如何优化企业库存管理?

随着社会的发展和经济的不断增长,库存管理成为了企业运营中非常重要的一环。库存作为企业的资产之一,直接影响着企业的盈利能力和竞争优势。因此,对企业库存进行科学的分析和管理,成为了确保企业持续稳定发展的必要手段之一。企业…

lv21 QT 常用控件 2

1 QT GUI 类继承简介 布局管理器 输出控件 输入控件 按钮 容器 2 按钮示例 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QCheckBox> #include <QLineEdit> #include <QPushButton>class Widget : public QWidget {Q_OBJECTpublic…

改善C++程序与设计的55个具体做法——2.尽量以const,enum,inline替换#define

const和#define 这个条款或许改为“宁可以编译器替换预处理器”比较好&#xff0c;因为或许#define不被视为语言的一部分。那正是它的问题所在。当你做出这样的事情&#xff1a; #define ASPECT RATIO 1.653 记号名称ASPECT_RATIO也许从未被编译器看见&#xff1b;也许在编译…

Vue+SpringBoot打造社区买菜系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.1.1 数据中心模块2.1.2 菜品分类模块2.1.3 菜品档案模块2.1.4 菜品订单模块2.1.5 菜品收藏模块2.1.6 收货地址模块 2.2 可行性分析2.3 用例分析2.4 实体类设计2.4.1 菜品分类模块2.4.2 菜品档案模块2.4.3…

golang学习6,glang的web的restful接口传参

1.get传参 //get请求 返回json 接口传参r.GET("/getJson/:id", controller.GetUserInfo) 1.2.接收处理 package controllerimport "github.com/gin-gonic/gin"func GetUserInfo(c *gin.Context) {_ c.Param("id")ReturnSucess(c, 200, &quo…

学习python的第7天,她不再开放她的听歌榜单

我下午登录上小号&#xff0c;打开聊天消息看到了她的回复&#xff0c;我很开心兴奋&#xff0c;可是她不再开放她的听歌榜单了&#xff0c;我感觉得到&#xff0c;我要失恋了。 “因为当年电视上看没有王菲版本的” “行”。 “那你以后还会开放听歌榜单吗&#xff1f;”我…

jmeter 按线程数阶梯式压测数据库

当前版本&#xff1a; jmeter 5.6.3mysql 5.7.39 简介 JMeter 通过 bzm - Concurrency Thread Group 来实现阶梯式压测&#xff0c;它并不是JMeter的官方插件&#xff0c;而是一种由Blazemeter提供的高级线程组插件。可以在不同的时间内并发执行不同数量的线程&#xff0c;模拟…

VUE基础知识九 ElementUI项目

ElementUI官网 一 项目 最终完成的效果&#xff1a; 切换上边的不同按钮&#xff0c;下方显示不同的表格数据 在src/components下新建不同业务组件的文件夹 1.1 搭建项目 使用脚手架搭建项目后&#xff0c;引入ElementUI&#xff08;搭建、引入ElementUI步骤在第七节里已…

CKA认证,开启您的云原生之旅!

在当今数字化时代&#xff0c;云计算已经成为企业和个人发展的关键技术。而获得CKA&#xff08;Certified Kubernetes Administrator&#xff09;认证&#xff0c;将是您在云原生领域迈出的重要一步。 CKA认证是由Kubernetes官方推出的权威认证&#xff0c;它旨在验证您在Kuber…

事件循环解析

浏览器的进程模型 何为进程&#xff1f; 程序运行需要有它自己专属的内存空间&#xff0c;可以把这块内存空间简单的理解为进程 每个应用至少有一个进程&#xff0c;进程之间相互独立&#xff0c;即使要通信&#xff0c;也需要双方同意。 何为线程&#xff1f; 有了进程后&…

Premiere模板|可调整大小的快节奏图文视频模板剪辑素材

适用于Premiere Pro的可调整大小的快节奏图文视频开场pr模板素材mogrt。 主要特点&#xff1a;可调整大小&#xff08;19201080、10801920&#xff09;分辨率&#xff0c;Pr2021或更高版本软件&#xff0c;非常易于定制&#xff0c;19秒持续时间。 来自PR模板网&#xff1a;htt…

解析Hadoop三大核心组件:HDFS、MapReduce和YARN

目录 HadoopHadoop的优势 Hadoop的组成HDFS架构设计Yarn架构设计MapReduce架构设计 总结 在大数据时代&#xff0c;Hadoop作为一种开源的分布式计算框架&#xff0c;已经成为处理大规模数据的首选工具。它采用了分布式存储和计算的方式&#xff0c;能够高效地处理海量数据。Had…

MySQL数据库进阶第五篇(锁)

文章目录 一、锁的概述二、全局锁三、表级锁四、元数据锁&#xff08;meta data lock, MDL&#xff09;五、意向锁六、行级锁七、行锁&#xff08;Record Lock&#xff09;八、间隙锁&#xff08;Gap Lock&#xff09;九、临键锁&#xff08;Next-Key Lock&#xff09;十、锁总…

python(ch1)

四个软件简介 1. IDLE IDLE 是 Python 官方 IDLE 开发环境&#xff0c;一个功能简单的文本编辑器&#xff0c;带有语法高亮、自动补全和缩进功能。它适合初学者学习 Python 的基本语法和概念。 2. PyCharm PyCharm 是 JetBrains 开发的一款功能强大的 Python IDE&#xff0…

ChatGPT带火的HBM是什么?

“ChatGPT是人工智能领域的iPhone时刻&#xff0c;也是计算领域有史以来最伟大的技术之一。” 英伟达创始人兼CEO黄仁勋此前这样盛赞ChatGPT。 ChatGPT突然爆火&#xff0c;对大算力芯片提出了更高更多的要求。近日&#xff0c;据韩国经济日报报道&#xff0c;受惠于ChatGPT&am…

naive-ui-admin BasicTable 列表操作栏显示图标icon

效果图 在使用BasicTable的页面添加引用&#xff0c;这里随便弄了个icon import { GameController } from "vicons/ionicons5" 自定义列 const actionColumn reactive({width: 180,title: "操作",key: "action",fixed: "right",ren…

python爬虫实战:获取电子邮件和联系人信息

引言 在数字时代&#xff0c;电子邮件和联系人信息成为了许多企业和个人重要的资源&#xff0c;在本文中&#xff0c;我们将探讨如何使用Python爬虫从网页中提取电子邮件和联系人信息&#xff0c;并附上示例代码。 目录 引言 二、准备工作 你可以使用以下命令来安装这些库&a…

【笔记】深度学习入门:基于Python的理论与实现(二)

神经网络的学习&#xff08;神经网络的学习阶段&#xff0c;不是我们学习神经网络&#xff09; 从数据中学习 训练数据和测试数据 机器学习中&#xff0c;一般将数据分为训练数据和测试数据两部分来进行学习和 实验等。首先&#xff0c;使用训练数据进行学习&#xff0c;寻找最…