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

在这里插入图片描述

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

在这里插入图片描述

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

  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://xiahunao.cn/news/2812041.html

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

相关文章

如何在项目中考虑非功能需求

软件的非功能需求指的是除了软件的功能需求以外,软件需要满足的一些其他需求。常见的非功能需求包括: 性能需求:软件需要在特定的时间内完成特定的任务,例如响应时间、吞吐量等。可靠性需求:软件需要在各种环境下都能…

pclpy VoxelGrid 滤波器 (降体素化)

[TOC](pclpy VoxelGrid 滤波器 (降体素化)) 一、算法原理 使用体素化网格方法对点云数据集进行下采样(即减少点数)。VoxelGrid类。在输入点云数据上创建一个3D 体素网格(将体素网格视为空间中的一组微小的 3D 框)。然后在每个体…

RK3568平台开发系列讲解(基础篇)如何快速学习一套 Linux开发板源码

🚀返回专栏总目录 文章目录 一、基础代码二、驱动代码沉淀、分享、成长,让自己和他人都能有所收获!😄 拿到一份源码和一块评估板,如何快速找到与这块板相关的源码,是很多研发人员都曾遇到过的问题。如果对内核源码结构有大概了解,要完成这些事情也不难,通常可按照基础…

AVL树简介及其四种旋转

AVL树由二叉搜索树进化而来。在二叉搜索树中如果出现特殊情况:所有插入的数据均为有序,根据二叉搜索树的插入原理,其会退化为单枝斜向下的而二叉树,此时插入,查找,删除的效率也就退化成了O(n),效…

CUDA编程 - 用向量化访存优化 elementwise 核函数 - 学习记录

Cuda elementwise 一、简介1.1、ElementWise1.2、 float4 - 向量化访存 二、实践2.1、如何使用向量化访存2.2、Cuda elementwise - Add2.3、Cuda elementwise - Sigmoid2.3.1、简单的 Sigmoid 函数2.3.2、ElementWise Sigmoid float4(向量化访存) 2.4、C…

js里面有引用传递吗?

一:什么是引用传递 引用传递是相对于值传递的。那什么是值传递呢?值传递就是在传递过程中再复制一份,然后再赋值给变量,例如: let a 2; let b a;在这个代码中,let b a; 就是一个值传递,首先…

从零开始学Spring Boot系列-Hello World

欢迎来到从零开始学Spring Boot的旅程!我们将从一个非常基础但重要的示例开始:创建一个简单的Spring Boot应用程序,并输出“Hello World”。 1. 环境准备 首先,确保你的开发环境已经安装了以下工具: Java Development …

读人工不智能:计算机如何误解世界笔记04_数据新闻学

1. 计算化和数据化的变革 1.1. 每一个领域都在进行计算化和数据化的变革 1.1.1. 出现了计算社会科学、计算生物学、计算化学或其他数字人文学科 1.1.2. 生活已走向计算化,人们却一点也没有变 1.2. 在如今的计算化和数据化世界中,调查性新闻的实践必须…

掌握ChatGPT润色绝技:什么是人工智能写作以及如何使用它来完成写作任务

如对AI写论文感兴趣,欢迎添加作者wx讨论 : ryan_2982 人工智能 (AI) 的出现开创了技术进步的新时代,彻底改变了包括写作和内容创作在内的各个行业。人工智能写作和人工智能提示已成为可以简化和增强写作任务的强大工具。在这篇博文中,我们将…

2018-02-14 新闻内容爬虫【上学时做论文自己爬新闻数据,原谅我自己懒发的图片】

2018-02-14新闻内容爬虫【上学时做论文自己爬新闻数据,原谅我自己懒发的图片】资源-CSDN文库https://download.csdn.net/download/liuzhuchen/88878591爬虫过的站点: 1QQ新闻 1,准备爬取滚动新闻页面 2 通过F12 开发工具查找发现&#xff…

k8s节点负载使用情况分析命令kubectl describe node [node-name]

1.到任意安装了kubectl节点命令的节点上执行kubectl describe node [node-name] 上面的Requests最小分配 Limits最大分配是所有pod之和,最小分配之和不能超过服务器实际参数,否则新的pod会因为资源不够起不来,最大分配是预设之和&#xff0…

office word保存pdf高质量设置

1 采用第三方pdf功能生成 分辨率越大质量越好

leetcode(算法) 83.删除排序链表中的重复元素(python版)

需求 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 示例 1: 输入:head [1,1,2] 输出:[1,2] 示例 2: 输入:head [1,1,2,3,3] 输出&…

Android WebView访问网页+自动播放视频+自动全屏+切换横屏

一、引言 近期,我发现电视家、火星直播等在线看电视直播的软件都已倒闭,而我奶奶也再无法通过这些平台看电视了。她已六十多岁,快七十岁啦。这些平台的倒下对我来说其实没有多大的影响,但是对于文化不多的她而言,生活中…

大模型学习笔记四:LangChain开发框架解析

文章目录 一、langChain核心组件介绍二、模块I/O封装1)多轮对话 Session 封装2)模型的输入(1)Prompt模板封装(2)从文件加载Prompt模板 3)模型的输出(1)Pydantic (JSON) P…

c入门第二十四篇: 学生成绩管理系统优化(可执行文件传参)

前言 我:“师弟,review完你的代码之后,你觉得有没有什么地方可以优化?” 师弟一脸懵。 我:“比如,你把客户端和服务端的可执行文件生成之后,我把服务端部署到我的测试机器上,客户端…

通过css修改video标签的原生样式

通过css修改video标签的原生样式 描述实现结果 描述 修改video标签的原生样式 实现 在控制台中打开设置,勾选显示用户代理 shadow DOM,就可以审查video标签的内部样式了 箭头处标出来的就是shodow DOM的内容,这些内容正常不可见的&#x…

下载huggingface数据集到本地并读取.arrow文件遇到的问题

文章目录 1. 524MB中文维基百科语料(需要下载的数据集)2. 下载 hugging face 网站上的数据集3. 读取 .arrow 文件报错代码4. 纠正后代码 1. 524MB中文维基百科语料(需要下载的数据集) 2. 下载 hugging face 网站上的数据集 要将H…

07_第七章 前端工程化(es6,Vue3,Element_plus组件库)

文章目录 第七章 前端工程化一、前端工程化开篇1.1 什么是前端工程化1.2 前端工程化实现技术栈 二、ECMA6Script2.1. es6的介绍2.2 es6的变量和模板字符串2.3 es6的解构表达式2.4 es6的箭头函数2.4.1 声明和特点2.4.2 实践和应用场景2.4.3 rest和spread 2.5 es6的对象创建和拷贝…

绝地求生:春节部分活动将结束,3月有新版本上线,通行证不偷懒可换成长型

嗨,我是闲游盒~ 感觉过年就在眼前但是已经结束了,时间过的太快了又回归了工作的生活中,而年前更新的28.1新春版本也进行到了小一半的进度。 ◆ 春节版本部分活动即将结束 在大厅首页右上角的活动中心里,春节积分商店和觉醒之旅活动…