热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

23种设计模式-前言

23种设计模式-前言当我们学习时,到底在学习什么什么是设计模式产生背景目的

  • 23种设计模式 - 前言
    • 当我们学习时,到底在学习什么
    • 什么是设计模式
    • 产生背景
    • 目的
    • 设计模式的六大原则
    • 23种设计模式

23种设计模式 - 前言

当我们学习时,到底在学习什么

无论学习什么内容,我们基本都是从几个维度循序渐进去了解和熟悉,至到融入记忆;当再遇到类似问题时,这些曾经学习的知识能立马涌现到脑海,以用于解决对应的问题;这些维度主要分为以下几点:

  • 是什么
  • 为什么
  • 能解决什么
  • 如何实现
  • 如何使用
  • 什么场景下使用

下面我们学习设计模式,也将从这几个维度进行阐述;

什么是设计模式

在学习设计模式之前,我们先从宏观角度分析,它到底是什么;

设计模式:
设计过程中可以反复使用 的、可以解决特定问题 的设计方法。

从上面的概念可知,设计模式是可以反复使用,并且可以用来解决问题的方法;
无论如何形容与修饰,它的本质是:一种方法,一种解决问题的套路

拓展
因此任何可以结总提炼,并用于解决一类问题的解决方案都可以称之为模式;
本系列主要指代码编写中的模式,为狭义的模式;

产生背景

在开发和代码书写时,总会遇到一些经常出现的问题,以及基于这些问题的一些通用解决方案;

目的

把常见问题的通用解决方案经总结和提炼,形成固定的解决方案和套路;

在遇到这些常见的问题时,可以不假思索的直接使用那些已经经过总结的解决方案和套路;

设计模式的六大原则

设计模式是对解决问题的方案总结;这些模式遵循以下原则:

  • 开闭原则
开闭
一开一闭:对扩展开放,对修改封闭;它是以下其它所有原则的基础准则;
什么是扩展:
所谓扩展,即在原有功能基础上,增加新的功能或新的特性;
什么是修改:
所谓修改,即对原有功能进行变更
为什么对扩展开放,对修改封闭:
A: 可以无限增加新功能
扩展的目的是,可以使代码无限拓展,功能无限增加,需求无限成长;这是一个项目或系统随着时间不断成长的必要条件;

B: 不影响原有功能
在扩展项目或系统的前提条件下,不能影响原有功能,否则可能导致牵一发而动全身,无法集中力量投入新业务和新需求中;

  • 单一职责原则
概念:
一个类应该只有一个发生变化的原因

白话:即一个类只承担一个维度的功能;不要让一个类承担太多维度的功能;同理,一个方法,只执行一个事件的处理;

示例:一个系统的用户及登录功能
UserService 只应该负责 用户本身的处理(增、删、改、查),不应承担登录相关的功能;
LoginService 可以依赖UserService提供的服务,对外提供登录,但本身不应该处理用户信息;

  • 里氏替换原则
    任何基类可以出现的地方,子类一定可以出现;

    对于面向对象的开发者,可以简单的理解为:继承;防止陷入生涩的概念之中;

  • 依赖倒转原则
    面向接口编程,依赖于抽象而不依赖于具体。写代码时用到所需要依赖时,不应该与具体类交互,而应该与具体类的接口交互。

对于面向对象的开发者,可以简单的理解为:面向接口编程;

原因:
接口是入口,是对接的边界,实现是扩展,只要接口不变,就不影响原有功能; 但实现可以无限扩展,就可以实现无限的功能
  • 接口隔离原则

  • 迪米特法则

概念
迪米特法则:最少知道原则;即一个类对自己依赖的类知道的越少越好;即每个类都应该自治,只需要对外提供必要的接口进行相互调用即可;
目的:
类与依赖之间松耦合,
  • 合成复用原则
    继承是一种扩展,但是与基类却有一定程度的耦合;合成复用则一种更大的松耦合方式;
概念
通过聚合、引用的方式实现扩展,而不是使用继承;

23种设计模式

23种设计总体可以分为三类:

    创建型模式

创建型模式:主要用于创建对象;

  • 单例模式
  • 工厂方法模式
  • 抽象工厂模式
  • 建造者模式
  • 原型模式
    结构型模式:

结构型模式:主要用于改变类的结构

  • 适配器模式
  • 装饰者模式
  • 代理模式
  • 外观模式
  • 桥接模式
  • 组合模式
  • 享元模式
    行为型模式:

行为型模式:主要用于改变行为(逻辑)

  • 策略模式
  • 模板方法模式
  • 观察者模式
  • 迭代子模式
  • 责任链模式
  • 命令模式
  • 备忘录模式
  • 状态模式
  • 访问者模式
  • 中介者模式
  • 解释器模式

推荐阅读
  • 解决PHP与MySQL连接时出现500错误的方法
    本文详细探讨了当使用PHP连接MySQL数据库时遇到500内部服务器错误的多种解决方案,提供了详尽的操作步骤和专业建议。无论是初学者还是有经验的开发者,都能从中受益。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • 本文将深入探讨PHP编程语言的基本概念,并解释PHP概念股的含义。通过详细解析,帮助读者理解PHP在Web开发和股票市场中的重要性。 ... [详细]
  • 2018年3月31日,CSDN、火星财经联合中关村区块链产业联盟等机构举办的2018区块链技术及应用峰会(BTA)核心分会场圆满举行。多位业内顶尖专家深入探讨了区块链的核心技术原理及其在实际业务中的应用。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]
  • 资源推荐 | TensorFlow官方中文教程助力英语非母语者学习
    来源:机器之心。本文详细介绍了TensorFlow官方提供的中文版教程和指南,帮助开发者更好地理解和应用这一强大的开源机器学习平台。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 将Web服务部署到Tomcat
    本文介绍了如何在JDeveloper 12c中创建一个Java项目,并将其打包为Web服务,然后部署到Tomcat服务器。内容涵盖从项目创建、编写Web服务代码、配置相关XML文件到最终的本地部署和验证。 ... [详细]
  • ServiceStack与Swagger的无缝集成指南
    本文详细介绍了如何在ServiceStack项目中集成Swagger,以实现API文档的自动生成和在线测试。通过本指南,您将了解从配置到部署的完整流程,并掌握如何优化API接口的开发和维护。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • 本文详细介绍了在 Windows 2000 系统中启用 TELNET 服务时需要注意的 NTLM 配置问题,帮助用户解决常见的身份验证失败错误。 ... [详细]
author-avatar
大好
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有