设计模式-开篇

什么是设计模式

设计模式是一种被反复使用、多数人知晓的、经过分类编目的代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、提高代码的可靠性。设计模式不是可直接转化为代码的完成解决方案,而是描述了如何解决一个问题的经过,可以用于指导开发人员在他们的应用程序中编写代码,从而提高代码的可读性、可维护性和可扩展性。

设计模式有多种分类方式。根据目的(模式是用来做什么的),可分为创建型,结构型和行为型三类:

  1. 创建型模式:主要用于创建对象。
  2. 结构型模式:主要用于处理类和对象的组合。
  3. 行为型模式:主要用于描述类或对象如何交互和怎样分配职责。

此外,根据范围,即模式主要是处理类之间的关系还是处理对象之间的关系,可分为类模式和对象模式两种。

这些模式包括但不限于工厂模式、单例模式、原型模式、适配器模式、装饰器模式、代理模式等。在软件开发中,设计模式可以提高软件开发效率和质量,减少代码的重复性,并使软件更加灵活、可扩展和易于维护。

应用场景

设计模式的主要应用场景包括但不限于以下几个方面:

  1. 软件架构设计:在软件架构设计中,设计模式可以用于指导如何组织类和对象,以及如何规划它们之间的交互。这有助于提高软件的可维护性、可扩展性和灵活性。
  2. 代码重构:当代码变得难以理解和维护时,设计模式可以作为重构的指南。通过使用适当的设计模式,可以将复杂的代码结构简化为更易于理解的结构,同时保持其功能不变。
  3. 通用问题解决:许多设计模式是为了解决在软件开发中经常出现的问题而创建的。例如,单例模式可以确保一个类只有一个实例,并提供全局访问点,这在需要协调多个对象的行为时非常有用。
  4. 性能优化:某些设计模式,如观察者模式,可以用于优化性能。观察者模式允许对象通过订阅事件来接收通知,从而避免了不必要的计算和通信开销。
  5. 大型项目开发:在大型项目中,设计模式可以作为一种通用的语言,帮助开发团队更好地协作。通过使用共同的设计模式,团队成员可以更轻松地理解彼此的代码,并提高开发效率。

需要注意的是,虽然设计模式提供了解决问题的最佳实践,但它们并不是万能的。在使用设计模式时,应根据具体情况进行评估,并确保它们符合项目的需求和目标。

实际案例

当然可以。以下是一些常见的设计模式的实际案例:

  1. 单例模式(Singleton Pattern):在许多应用程序中,确保一个类只有一个实例是非常重要的。例如,在数据库连接中,通常使用单例模式来管理数据库连接。只有一个数据库连接实例可以确保对数据库的多个操作是线程安全的。
  2. 工厂模式(Factory Pattern):工厂模式是一种创建型模式,它提供了一种创建对象的接口,但具体创建的对象类型可以在运行时决定。例如,在图形用户界面(GUI)开发中,可以使用工厂模式来创建不同类型的按钮。这样,可以根据需要动态地创建和配置按钮。
  3. 适配器模式(Adapter Pattern):适配器模式是一种结构型模式,它允许将一个类的接口转换成客户端所期望的另一种接口。例如,在音频设备中,一个耳机适配器可以将设备的输出接口转换为耳机可以接受的输入接口。
  4. 装饰器模式(Decorator Pattern):装饰器模式是一种结构型模式,它可以在不修改原始类的情况下动态地添加功能或修改功能。例如,在编程语言解释器中,可以使用装饰器模式来动态地添加或修改语法规则。
  5. 观察者模式(Observer Pattern):观察者模式是一种行为型模式,它允许对象通过发布/订阅模型进行通信。例如,在天气预报应用中,天气数据可以被订阅,当天气发生变化时,所有订阅的用户都会收到通知。
  6. 策略模式(Strategy Pattern):策略模式是一种行为型模式,它允许根据不同的策略执行不同的算法或行为。例如,在游戏开发中,可以使用策略模式来动态地选择游戏的AI策略,从而提供不同的游戏体验。
  7. 模板方法模式(Template Method Pattern):模板方法模式是一种行为型模式,它定义了一个操作中的算法骨架,将某些步骤延迟到子类中实现。例如,在图像处理软件中,可以使用模板方法模式来定义图像处理的基本步骤(加载图像、处理图像、保存图像),并允许用户通过继承和重写这些步骤来自定义图像处理算法。

这些案例只是设计模式应用的一部分示例。在实际软件开发中,设计模式的应用非常广泛,可以根据具体的需求和场景选择合适的设计模式来解决特定的问题。

代码示例

设计模式的示例代码有很多,这里我提供一个观察者模式的示例代码,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象状态发生改变时,其相关依赖项(观察者)会被通知,自动更新。

import java.util.ArrayList;
import java.util.List;// 观察者接口
interface Observer {void update(String event);
}// 被观察者接口
interface Subject {void registerObserver(Observer observer);void removeObserver(Observer observer);void notifyObservers(String event);
}//具体被观察者类
class ConcreteSubject implements Subject {private List<Observer> observers = new ArrayList<>();private String event;@Overridepublic void registerObserver(Observer observer) {observers.add(observer);}@Overridepublic void removeObserver(Observer observer) {observers.remove(observer);}@Overridepublic void notifyObservers(String event) {this.event = event;for (Observer observer : observers) {observer.update(event);}}
}//具体观察者类
class ConcreteObserver implements Observer {private String name;ConcreteObserver(String name) {this.name = name;}@Overridepublic void update(String event) {System.out.println(name + " received event: " + event);}
}

使用示例:

public class Test {public static void main(String[] args) {Subject subject = new ConcreteSubject(); // 具体被观察者对象Observer observer1 = new ConcreteObserver("Observer 1"); // 具体观察者对象1Observer observer2 = new ConcreteObserver("Observer 2"); // 具体观察者对象2subject.registerObserver(observer1); // 注册观察者对象1subject.registerObserver(observer2); // 注册观察者对象2subject.notifyObservers("event"); // 通知所有注册的观察者对象事件event,所有观察者对象会响应这个事件,打印出收到的事件内容。}
}
## 分类
设计模式的分类主要分为**创建型模式****结构型模式****行为型模式**。此外,也有一种扩展模式。1. **创建型模式**:用于处理对象的创建过程,包括如单例模式、工厂方法模式、抽象工厂模式、建造者模式等。
2. **结构型模式**:用于处理类或对象的组合,以形成更大的结构,例如适配器模式、装饰者模式、代理模式等。
3. **行为型模式**:用于描述类或对象如何交互,以及划分责任和如何通信,包括策略模式、观察者模式、迭代器模式等。以上是简单介绍,各种设计模式有各自的应用场景和特点,需要结合实际问题进行选择和使用。## 总结
在接下来的文章中,我们会对设计模式逐一进行梳理和解释说明,让我们开始设计模式的学习之旅吧

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

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

相关文章

图论——二部图及其算法

什么是二部图 二部图的判定 例子1 任选一个节点染成红色 红色的邻居染成蓝色 蓝色邻居染成红色 例子2 这个不是二部图 无权二部图的最大匹配

Jacobi迭代与SOR迭代求解希尔伯特矩阵

给出线性方程组 Hn*x b&#xff0c;其中系数矩阵Hn为希尔伯特矩阵&#xff1a; 假设 x ∗ (1, 1, . . . , 1)T&#xff0c;b Hnx ∗。若取 n 6,8, 10&#xff0c;分别用 Jacobi 迭代法及 SOR迭代&#xff08;ω 1, 1:25,1:5&#xff09;求解&#xff0c;比较计算结果。…

leetcode做题笔记1457. 二叉树中的伪回文路径

给你一棵二叉树&#xff0c;每个节点的值为 1 到 9 。我们称二叉树中的一条路径是 「伪回文」的&#xff0c;当它满足&#xff1a;路径经过的所有节点值的排列中&#xff0c;存在一个回文序列。 请你返回从根到叶子节点的所有路径中 伪回文 路径的数目。 示例 1&#xff1a; 输…

【计算机网络笔记】多路访问控制(MAC)协议——随机访问MAC协议

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

Error PostCSS plugin autoprefixer requires PostCSS 8

文章目录 一、情况一二、情况二三、总结 在启动 vue项目时&#xff0c;突然控制台报错&#xff1a; Error: PostCSS plugin autoprefixer requires PostCSS 8。然后依次出现下面几种情况&#xff0c;依次解决完&#xff0c;项目就可以正常启动了 一、情况一 error in ./src/…

万宾科技可燃气体监测仪的功能有哪些?

随着城市人口的持续增长和智慧城市不断发展&#xff0c;燃气作为一种重要的能源供应方式&#xff0c;已经广泛地应用于居民生活和工业生产的各个领域。然而燃气泄漏和安全事故的风险也随之增加&#xff0c;对城市的安全和社会的稳定构成了潜在的威胁。我国燃气管道安全事故的频…

redhat9.3配置国内yum阿里源

由于新建的Redhat9.3在未注册激活之前是没有yum源的配置文件的&#xff0c;所以需要我们自己新建一个yum源文件的配置文件 vim /etc/yum.repos.d/aliyun_yum.repo 内容如下&#xff1a; [ali_baseos] nameali_baseos baseurlhttps://mirrors.aliyun.com/centos-stream/9-str…

基于Flutter的图片浏览器的实现

一 效果展示&#xff1a; 1. 图片展示&#xff1a; 2.混色&#xff0c;平铺&#xff0c;拉伸&#xff0c;原图展示 二 实验准备&#xff1a; 1.在包结构中创建images包来存放我们用到的图片&#xff0c;在pubspec.yaml中声明路径&#xff1a; 2. 检查虚拟机是否正常运行&…

面试问题--内存泄漏和内存溢出

解决内存溢出和内存泄漏的方法 内存溢出&#xff08;Memory Overflow&#xff09;和内存泄漏&#xff08;Memory Leak&#xff09;是常见的内存管理问题&#xff0c;可能导致程序崩溃或系统性能下降。下面是一些排除这两个问题的方法&#xff1a; 1. 区别&#xff1a;内存溢出…

crontab计划任务

银河麒麟v10服务器版和桌面版执行周期计划任务分为两类&#xff1a;系统任务调度和用户任务调度。系统任务是由 cron (crond) 这个系统服务来控制的&#xff0c;这个系统服务是默认启动的&#xff0c;通过vim /etc/crontab执行。用户自己设置的计划任务则使用crontab 命令 配置…

Vue 3

Vu3 简述: 快速上手,开发即用,具体知识参考官方文档 具备知识 Vite 了解即可,使用时按需配置,更多参考官方文档( https://cn.vitejs.dev) 简述: 极速响应工具 (构建、启动、更新、插件使用等) 核心思想: 依赖 和 源码 工作原理: 引入rollup: 灵活,相比webpack速度快,…

数据结构——堆的实现(详解)

呀哈喽&#xff0c;我是结衣。 堆的介绍 如果有一个关键码的集合K {k0,k1,k2,…,kn-1},把它的所有元素按照完全二叉树的顺序储存方式储存在一个一维数组中&#xff0c;并满足&#xff1a;Ki<K2i1且ki<K2i2(Ki>K2i1且Ki>-K2i2)i 1,2,3…,则称为小堆&#xff08;或…

Windows系统管理之备份与恢复

本章目录&#xff1a; 一. 本章须知&#xff1a; 前置条件 需要创建一个新的磁盘 前置条件2 给新添加的磁盘分盘 二. 了解开启并学会使用Windows sever backup 如何使用备份与恢复“备份计划”“一次性备份”“恢复” 最后是用命令行“一次性备份命令 ”完成一次备份 话不多说 …

React中如何解决点击<Tree>节点前面三角区域不触发onClick事件

React中如何解决点击节点前面三角区域不触发onClick事件&#xff0c;如何区别‘左边’和‘右边’区域点击逻辑呢&#xff1f;&#xff08;Tree引用开源组件TDesign&#xff09; 只需要在onClick里面加限制一下就行&#xff1a; <TreeexpandMutexactivabletransitiondata{t…

从0开始学习JavaScript--JavaScript函数返回值

在JavaScript中&#xff0c;函数是一种强大的工具&#xff0c;不仅能够执行一系列操作&#xff0c;还可以返回值。理解函数返回值的概念对于编写清晰、灵活的代码至关重要。本文将深入探讨JavaScript函数返回值的各种方面&#xff0c;包括基本返回值、多返回值、异步函数的返回…

STM32_8(DMA)

一、DMA DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输&#xff0c;无须CPU干预&#xff0c;节省了CPU的资源12个独立可配置的通道&#xff1a; DMA1&#xff08;7个通道&#xff09;&#xff…

吉他初学者学习网站搭建系列(3)——如何实现吉他在线调音

文章目录 背景知识teoriapitchytone效果 背景知识 学过初中物理就会知道&#xff0c;声音是由空气振动产生的。振动产生波&#xff0c;所以声音就是不同振幅和频率的波构成的。振幅决定了声音的响度&#xff0c;频率决定了声音的音高。想更进一步了解的可以访问这个网页wavefo…

万字解析设计模式之责任链模式、状态模式

目录 一、责任链模式 1.1概述 1.2结构 1.3实现 1.4 优缺点 1.5应用场景 1.6源码解析 二、状态模式 2.1概述 2.2结构 2.3实现 2.4优缺点 2.5应用场景 三、责任链模式实验 任务描述 实现方式 编程要求 测试说明 四、状态模式实验 任务描述 实现方式 编程要…

Leetcode—55.跳跃游戏【中等】

2023每日刷题&#xff08;四十&#xff09; Leetcode—55.跳跃游戏 贪心法实现代码 #define MAX(a, b) ((a > b)? (a): (b))bool canJump(int* nums, int numsSize) {int k 0;for(int i 0; i < numsSize; i) {if(i > k) {return false;}k MAX(k, i nums[i]);}r…

Linux(7):Vim 程序编辑器

vi 基本上 vi 共分为三种模式&#xff0c;分别是【一般指令模式】、【编辑模式】与【指令列命令模式】。 这三种模式的作用分别是&#xff1a; 一般指令模式(command mode) 以 vi 打开一个文件就直接进入一般指令模式了(这是默认的模式&#xff0c;也简称为一般模式)。在这个模…