当前位置: 首页 > news >正文

.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接口)来处理不同角色的行为。这样,当我们需要添加新的角色类型时,只需要修改工厂类即可,而不需要修改现有的代码。这使得系统更加灵活和可扩展。

相关文章:

  • lua函数定义
  • RabbitMQ在订单服务中的使用【沙盘演示】
  • Stable Diffusion 3 发布及其重大改进
  • CGAL 二维保角三角剖分
  • 小龙虾优化算法COA求解不闭合MD-MTSP,可以修改旅行商个数及起点(提供MATLAB代码)
  • Android基础进阶 - RecyclerView列表加载多类型视图
  • IT廉连看——Uniapp——页面样式与布局
  • NUS神经网络生成我感觉解读过于夸大了
  • Git 报错:unable to update local ref
  • 【Vue】组件通信组件通信
  • 树结构数据
  • 2步破解官方sublime4
  • CSS 入门手册(一)
  • 【Python】Ubuntu创建虚拟环境运行Python
  • java面试题之mybatis篇
  • 【comparator, comparable】小总结
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • Angular4 模板式表单用法以及验证
  • CAP 一致性协议及应用解析
  • CSS盒模型深入
  • java中的hashCode
  • JSDuck 与 AngularJS 融合技巧
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • 实战|智能家居行业移动应用性能分析
  • 使用 Docker 部署 Spring Boot项目
  • 数据科学 第 3 章 11 字符串处理
  • 转载:[译] 内容加速黑科技趣谈
  • 06-01 点餐小程序前台界面搭建
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • #预处理和函数的对比以及条件编译
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (1)Android开发优化---------UI优化
  • (12)Linux 常见的三种进程状态
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (笔试题)分解质因式
  • (第二周)效能测试
  • (分布式缓存)Redis哨兵
  • (六)软件测试分工
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转载)OpenStack Hacker养成指南
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .net framework 4.0中如何 输出 form 的name属性。
  • .Net多线程总结
  • .net反编译工具
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • []error LNK2001: unresolved external symbol _m
  • []sim300 GPRS数据收发程序
  • [2008][note]腔内级联拉曼发射的,二极管泵浦多频调Q laser——
  • [ai笔记9] openAI Sora技术文档引用文献汇总
  • [Arduino学习] ESP8266读取DHT11数字温湿度传感器数据
  • [C#]winform使用引导APSF和梯度自适应卷积增强夜间雾图像的可见性算法实现夜间雾霾图像的可见度增强