设计模式之设计模式概述-shejimoshigaishu

title: 设计模式之设计模式概述
date: 2022-12-04 00:21:18.469
updated: 2022-12-11 23:03:45.617
url: http://www.yby6.com/archives/shejimoshigaishu
categories: 
- 设计模式
tags: 
- 设计模式

一、什么是设计模式

  1. 软件设计模式(Software Design Pattern),又称设计模式,
  2. 是一套被反复使用、多数人知晓的、代码设计经验的总结。
  3. 它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。
  4. 也就是说,它是解决特定问题的一系列套路,具有一定的普遍性,可以反复使用代码设计经验的总结。

二、为什么要学习设计模式

  1. 使程序设计更加标准化、代码编制更加工程化,使软件开发效率大大提高,从而缩短软件的开发周期。
  2. 使设计的代码可重用性高、可读性强、可靠性高、灵活性好、可维护性强。
  3. 可以提高程序员的思维能力、编程能力和设计能力。
    4, 软件设计模式只是一个引导。在具体的软件幵发中,必须根据设计的应用系统的特点和要求来恰当选择。
    5. 对于简单的程序开发,可能写一个简单的算法要比引入某种设计模式更加容易。但对大项目的开发或者框架设计,用设计模式来组织代码显然更好。

三、GoF 23种设计模式

  1. 1995 年,艾瑞克·伽马(ErichGamma)、理査德·海尔姆(Richard Helm)、拉尔夫·约翰森(Ralph Johnson)、约翰·威利斯迪斯(John Vlissides)等 4 位作者
  2. 合作出版了《设计模式:可复用面向对象软件的基础》
  3. 在本教程中收录了 23 个设计模式,这是设计模式领域里程碑的事件
  4. 这 4 位作者在软件开发领域里也以他们的“四人组”(Gang of Four,GoF)匿名著称。

四、设计模式分类

根据模式是用来完成什么工作来划分,这种方式可分为创建型模式、结构型模式和行为型模式 3 种。

1、创建型模式5种

用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。

  • 工厂方法设计模式
  • 抽象工厂设计模式
  • 单例设计模式
  • 原型设计模式
  • 建造者设计模式

2、结构型模式7种

用于描述如何将类或对象按某种布局组成更大的结构

  • 代理设计模式
  • 适配器设计模式
  • 桥接设计模式
  • 装饰器设计模式
  • 外观设计模式
  • 享元设计模式
  • 组合设计模式
你的压力来源于无法自律,只是假装努力,现状跟不上内心欲望,所以你焦虑又恐慌。——杨不易
本文转载于网络 如有侵权请联系删除

相关文章

  • 支持全平台的百度网盘高速下载神器-星泽V社

    今天,推荐一款支持全平台的百度网盘不限速下载神器——极下DownLoad。 极下DownLoad都支持哪些平台呢?包括Windows、安卓、iOS、Macos等,极下DownLoad都能得到很好的支持,不过鉴于实际情况,基本大部分用户最常使用的下载百度网盘文件的方式还是在PC上。极下DownLoad下载文件的方式可以分为网页下载和客户端下载。网页下载极下DownLoad网页版支持在线解析百度网盘分享链接,解析之后就能得到一个直链下载地址 将下载地址复制进入下载器即可高速下载百度网盘文件,不过不同下载器操作方式也略有不同,建议大家在下载之前认真观看作者提供的视频教程。 现在我以idm为例,为大家演示下载一次。在解析到文件之后,首先复制用户代理。 然后进入idm的配置界面,将刚才复制的代理数据粘贴进对应窗口,并确定保存。 回到刚才的网页解析结果页面,复制下载地址,最后进入idm创建下载任务,即可成功高速下载这个文件。 本人通过这一方式下载文件,下载速度基本稳定在3M/s左右,相比不开百度网盘会员时的100KB/S,速度可以说提升了数十倍之多!客户端下载如果你觉得网页下载太麻烦,还需要

  • TI C66x DSP 系统events及其应用 – 5.1(QM accumulator的配置)

    大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。以下解说在详细应用中,event与中断ISR的设置。以对QM的queue监控产生中断(不是EXCEP)为例,主要包含配置QMaccumulator(用于监控QMqueue)与配置ISR(ISR与event配置)。首先介绍QMaccumulator的配置,QM模块中QMSS(包括QMSSTxqueue800:831,Tx/Rxchannel0:31,RxChan,TxChan,Txqueue是一一相应的,如Txqueue是806,那么相应的TxChan与RxChan编号都是6)用于CPU之间的通信,QMSSRxqueue能够配置为highpriorityqueue(也能够配置generalqueue等),然后利用PDSP的channel(0:31,该channel与分配给QM的chip-event是一一相应的,见QMuserguide5.2节)监控QMSSRxqueue,条件满足时,将会产生中断。QMSS的Txqueue是QMSS对外提供的唯一输入port(queue800:831),当有descriptorPUSH到QMSS

  • Codecraft-17 and Codeforces Round #391 (Div. 1 + Div. 2, combined) B. Bash's Big Day (Hash+简单数论)

    B.Bash'sBigDaytimelimitpertest2secondsmemorylimitpertest512megabytesinputstandardinputoutputstandardoutputBashhassetoutonajourneytobecomethegreatestPokemonmaster.TogethisfirstPokemon,hewenttoProfessorZulu'sLab.SinceBashisProfessorZulu'sfavouritestudent,ZuluallowshimtotakeasmanyPokemonfromhislabashepleases.ButZuluwarnshimthatagroupofk > 1Pokemonwithstrengths{s1, s2, s3, ..., sk}tendtofightamongeachotherifgcd(s1, s2, s3, ..., sk) = 1(seenotesforgcddefinition).Bash,beingsmart,does

  • 3个工具助你玩转正则表达式

    正则表达式可以说一直是大家的梦魇,但是正则在工作中实在是使用太广泛了,又不得不学习,但是却很难掌握其中的奥秘(我也是一样,用了就忘记了~)。为了能够让大家不再惧怕正则,有一些大神做了一些辅助工具用可视化的方式来帮助大家战胜正则,下面我们就来为大家介绍几款优秀的可视化工具。1.iHateRegex地址:https://ihateregex.io/介绍:这个工具的名称非常符号大家对正则的态度了,不过这个工具确实够强大,可以帮助我们快速搜索并匹配到合适的正则表达式,比如邮箱、日期、手机号码等等常见的验证规则。网站的整个风格非常简单,很容易上手使用,比如我们查询email的正则规则,会在新的页面显示正则结果,同样还有可视化的正则匹配过程,如下图所示:难能可贵的是这个工具还是开源的,仓库地址:https://github.com/geongeorge/i-hate-regex2.TheRegularExpressionVisualizer,Simulator&Cross-CompilerTool地址:https://blog.robertelder.org/regular-express

  • 在NetOps和SecOps的拉锯战中,SD-WAN起到了什么作用?

    跨越园区、分支机构、云和边缘的连接是构建数字化企业的基本要求,但是随着网络结构的扩展,端到端集成安全性的需求变得愈加重要。加上在园区,分支机构和边缘位置持续监视和维护应用程序性能的必要性,造成了NetOps和SecOps团队巨大的工作负担。结果往往是两个团队之间的拉锯战:一个努力保持网络的性能和可用性优化,另一个努力保持数据、应用程序和设备的安全。冲突还是合作?平衡NetOps和SecOps的关键在于如何管理网络以及所有连接的设备。传统上,在NetOps中,有单独的控制台来配置、监视和分析网络域。同样,为了使SecOps捕获、记录和分析所有不同域中的流量,在流量进入和离开域的地方都安装了特殊的tap。SecOps还有一个额外的工作,即在出现漏洞或恶意软件攻击成功时存储所有流量日志,以便查明原因并证明已采取适当措施来补救漏洞并防止以后的攻击。NetOps和SecOps究竟能否达成合作而不是互相冲突?数字化转型项目受益于统一运营和安全保障部署新的多云应用程序需要确保网络具有响应能力,始终可用且安全。NetOps需要与开发团队合作,以了解新应用程序的网络SLA和云使用要求。SecOps需要确

  • 安全验证框架shiro(二)

    这里主要说的是在web中的开发同样引用一段图片和说明Subject:主体,可以看到主体可以是任何可以与应用交互的“用户”;SecurityManager:相当于SpringMVC中的DispatcherServlet或者Struts2中的FilterDispatcher;是Shiro的心脏;所有具体的交互都通过SecurityManager进行控制;它管理着所有Subject、且负责进行认证和授权、及会话、缓存的管理。Authenticator:认证器,负责主体认证的,这是一个扩展点,如果用户觉得Shiro默认的不好,可以自定义实现;其需要认证策略(AuthenticationStrategy),即什么情况下算用户认证通过了;Authrizer:授权器,或者访问控制器,用来决定主体是否有权限进行相应的操作;即控制着用户能访问应用中的哪些功能;Realm:可以有1个或多个Realm,可以认为是安全实体数据源,即用于获取安全实体的;可以是JDBC实现,也可以是LDAP实现,或者内存实现等等;由用户提供;注意:Shiro不知道你的用户/权限存储在哪及以何种格式存储;所以我们一般在应用中都需要

  • 从Pixel 3a到Android Q,一份谷歌AI能力的“成绩单” | Google I/O全程回顾

    作者|琥珀出品|AI科技大本营(ID:rgznai100)当地时间5月7日上午(北京时间5月8日凌晨一点),一年一度的GoogleI/O开发者大会如期而至。今年也是Google旗帜鲜明推行“AIFirst”战略的第四个年头。让我们不妨先来盘点下从2016年起过去三年间GoogleI/O开发者大会亮相的重磅AI产品:2016年:GoogleAssistant(智能语音助手)、GoogleHome(智能音箱)、TPU1.0(为机器学习而设计的专用芯片)。 2017年:GoogleAssistant(升级版)、GoogleHome(升级版)、TPU2.0、TensorFlowLite(深度学习框架,针对移动和嵌入式设备)、GoogleLens(图像识别OCR)、GooglePhotos。 2018年:GoogleAssistant(升级版,使用Duplex技术)、GoogleMaps(融入AI技术)、GoogleLens(升级版,可关联场景)、TPU3.0、GoogleNews(个性化推荐消息)、Gmail(智能补充邮件)、Waymo(无人驾驶技术持续进展)。实际上,在每年开发者大会结束

  • 10必须了解托管云服务对业务增长的好处

    根据MarketsandMarkets™关于托管云服务的报告,“云托管服务市场规模预计将从2017年的271.5亿美元增长到2022年的537.8亿美元,预计复合年增长率(CAGR)为14.6%”。那么,什么是托管云服务选项,为什么公司正朝着这个方向发展呢?如今,组织以信息运行并安全地管理这些信息在当今时代至关重要。内部部署数据容易受到安全威胁,代价高昂的停机时间和数据丢失,并且可以在云上有效地管理这些问题。虽然从内部部署迁移到云似乎是一项艰巨的任务,但它比其他系统更容易实现,并为其用户提供了许多优势。以下是将托管云服务作为云战略不可或缺的一部分的十大优势。有效的成本管理与内部部署服务器不同,云托管服务可以降低成本,因为每月付款只需要使用已经使用的服务。通过可自定义的计划,企业可以通过仅承担所需设置的成本来优化他们为IT支持支付的金额。集中网络托管云服务提供商(MSP)管理托管云网络中的中央数据中心中的所有应用程序和服务器。因此,远程网络用户可以访问包括虚拟服务在内的同一网络中的集中数据。此外,通过云,可以将存储和备份构建到集中式网络中。因此,这种增加的网络可用性有助于提高业务性能。商

  • 手撕OpenCV源码之filter2D(二)

    cv::filter2D 前文对这个函数的分析是为了了解filter的实现结构,所以比较粗略,本文将更细致的分析opencv中filter2D的c++实现的细节,不涉及各种加速的实现方式首先还是看函数原型:4894voidcv::filter2D(InputArray_src,OutputArray_dst,intddepth, 4895InputArray_kernel,Pointanchor0, 4896doubledelta,intborderType) 4897{ 4898CV_INSTRUMENT_REGION() 4899 4900CV_OCL_RUN(_dst.isUMat()&&_src.dims()<=2, 4901ocl_filter2D(_src,_dst,ddepth,_kernel,anchor0,delta,borderType)) 4902 4903Matsrc=_src.getMat(),kernel=_kernel.getMat(); 4904 4905if(ddepth<0) 4906ddepth=src.depth();

  • 通过iptables限制sftp端口连接数

    之前在公司服务器上部署了sftp,用于上传业务系统的附件。后来由于程序连接问题,使的sftp连接数过多(做多时高达400多个sftp连接数),因为急需要对sftp的连接数做严格限制。操作记录如下:启动sftp本机的iptables防火墙功能,限制每个ip连接22端口(sftp连接端口即是ssh端口)最大为50个,当超过50后的连接数的流量就会被DROP掉! 同时iptables需要开放50000-65535范围的端口的访问(linux系统最大的端口为65535) [root@localhost~]#cat/etc/sysconfig/iptables #Firewallconfigurationwrittenbysystem-config-firewall #Manualcustomizationofthisfileisnotrecommended. *filter :INPUTACCEPT[0:0] :FORWARDACCEPT[0:0] :OUTPUTACCEPT[0:0] -AINPUT-mstate--stateESTABLISHED,RELATED-jACCEPT -AIN

  • 腾讯云云开发CloudBase获取云托管代码上传和下载urlapi接口

    1.接口描述接口请求域名:tcb.tencentcloudapi.com。 获取云托管代码上传url 默认接口请求频率限制:20次/秒。 APIExplorer提供了在线调用、签名验证、SDK代码生成和快速检索接口等能力。您可查看每次调用的请求内容和返回结果以及自动生成SDK调用示例。 2.输入参数以下请求参数列表仅列出了接口请求参数和部分公共参数,完整公共参数列表见公共请求参数。 参数名称 必选 类型 描述 Action 是 String 公共参数,本接口取值:DescribeCloudBaseBuildService。 Version 是 String 公共参数,本接口取值:2018-06-08。 Region 否 String 公共参数,本接口不需要传递此参数。 EnvId 是 String 环境id ServiceName 是 String 服务名 CIBusiness 否 String build类型,枚举值有:cloudbaserun,framework-ci ServiceVersion 否 String 服务版本

  • ML From Hung Yi Lee --- Why Deep ? #8

    WhyDeepLearning 深度越深就一定好吗? 并不意外,越深的model拟合效果越来越好 Fat+shortvsThis+Tall 长高会很有帮助,但是长宽不见得那么有帮助。 联想到隐藏层的作用,是帮助我们线性变换的,越深的model也许会变换的方向越来越多,而且每一个神经元都代表着一个subfunction,而这个subfunction可以给多个subsubfunction来使用,这样一个function的利用率就提高了。 Modularization(模组化) 上述的例子,长头发的男生的例子很少,但是我们可以把这个问题模组化,先判断是男生还是女生,然后在判断是长头发还是短头发,然后就把二者的结论结合起来输出结果,而不是说一上来就直接丢一堆数据去判断结果。因为长头发的男生的数据是很少的,模型构建出来的效果然也可能不那么优秀。 DeepLearning的每一层其实就是一个个module的感觉 Modularization-Speech 语音识别方向 对于人类语言,实际上是由一个个phoneme组成的,而不同的音之间会用连

  • 863. 二叉树中所有距离为 K 的结点 二叉树 dfs

    给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值K。 返回到目标结点target距离为K的所有结点的值的列表。答案可以以任何顺序返回。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/all-nodes-distance-k-in-binary-tree 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 /** *Definitionforabinarytreenode. *structTreeNode{ *intval; *TreeNode*left; *TreeNode*right; *TreeNode(intx):val(x),left(NULL),right(NULL){} *}; */ classSolution{ private: vector<int>ans; unordered_map<TreeNode*,TreeNode*>mp; public: voidfindParents(TreeNod

  • Kudu的安装和使用

    1、下载rpm   地址:https://archive.cloudera.com/cdh5/redhat/7/x86_64/cdh/5/RPMS/x86_64/   下载所有kudu开头的rpm包 2、安装:  rpm-ivh*--nodeps 3、启动:  servicekudu-masterstart  servicekudu-tserverstart   4、指令:    查看集群  kuduclusterkscklocalhost    查看master状态或flag  kudumasterstatuslocalhost  kudumasterget_flagslocalhost  可以查看到bound_http_addresses的port,则访问地址:localhost:port则是web管理页面。    查看tserver状态或flag  kudutserverstatuslocalhost  kudutserverget_flagslocalhost  &nb

  • Mysql开发规范

      说明 是否遵守共同的开发规范是决定产品成败的关键,所以编写规范的目的是让所有数据开发人员在开发过程中有依可循。 数据库库表设计规范 猪八戒所有的数据库、表原则上统一使用utf8编码,如果需要使用emoji表情请使用utf8mb4编码。 所有数据库名以zhubajie_打头,库名、表名必须使用下划线分割开,全部用小写字母,表名以库名的首字母缩写作为前缀(如zhubajie_market库下所有的表都以mk_打头),以保证该表的全局唯一性。 库名表名都是用名词,不使用动词,能见名知意。 数据库引擎建议使用innodb尽量不要使用myisam,日志尽量使用tokudb。 存储精度浮点数必须使用decimal替代float和double。 非负值的数字统一使用unsigned类型存储。 必须使用intunsigned存储IPV4。 整形定义中,不添加字段长度,比如使用int而不是int(5),即便定义了对字段长度、占用空间也没有意义。 能使用短数据类型的尽量使用短数据类型。比如取值范围是0-255时,使用tinyintunsigned。 使用tinyint类型代替enum

  • 从产品经理能力评估维度,掌握产品经理技能

    产品是企业发展的基石,好的产品经理是好产品的前提,本文通过案例介绍HR用的产品经理能力评估维度,让求职的产品经理能够掌握企业要求的产品经理,企业也可以根据此产品经理必备技能和工具培养产品经理。 我此前专门就“如何培养出优秀的产品经理”这一话题写过不少文章,也介绍了很多相关的差距分析工具(gapanalysistool,或称缺口分析工具),希望能够帮助产品总监们培养出更多优秀的产品经理,而今天的这篇文章可以说是前次介绍工具的“升级版”,主要介绍了如何进行产品经理能力评估。 我希望所有产品总监都能重视人才的培养,要想管理好一个跨职能的产品团队,必须要有能够胜任的产品经理,如果你不重视培养人才和提供成长机会,那么你的竞争对手就将趁虚而入。我看过很多优秀的年轻人是受到公司的感召慕名而来,结果却因为不堪忍受产品总监的折磨失望而去。 本文将介绍一种我自己常用,并且经常推荐给大家的一种方法,来帮助你高效评估产品经理能力,我认为对产品经理能力的评估,也是后期针对性对其进行指导的基础。这个能力评估方法是以差距分析的形式设计的,目的在于分析产品经理在不同等级任务中的胜任能力,进而判断其是否符合

  • Change the marquee directions on button click left and right

    example1: <html> <body> <scriptlanguage="JavaScript"> functionfunction1(){ document.all.myMarquee.direction="up"; } functionfunction2(){ document.all.myMarquee.direction="left"; } functionfunction3(){ document.all.myMarquee.direction="right"; } functionfunction4(){ document.all.myMarquee.direction="down"; } </script> <marqueeid="myMarquee"bgcolor="cyan">MARQUEETEXTHERE</marquee> <buttononclick="function1();">Up</button> <buttononclick="function

  • 基于Redisson的延迟队列实现

    packagecom.dong.mytest.demo.client; importcn.hutool.extra.spring.SpringUtil; importcom.dong.mytest.demo.common.dto.DelayMessage; importcom.dong.mytest.demo.common.util.DateUtil; importcom.dong.mytest.demo.service.delayqueue.DelayQueueConsumer; importcom.google.common.collect.Lists; importlombok.extern.slf4j.Slf4j; importorg.redisson.api.RBlockingQueue; importorg.redisson.api.RDelayedQueue; importorg.redisson.api.RedissonClient; importorg.springframework.beans.factory.InitializingBean; importorg

  • vue学习记录:vue引入,validator验证,数据信息,vuex数据共享

     最近在学习vue,关于学习过程中所遇到的问题进行记录,包含vue引入,validator验证,数据信息,vuex数据共享,传值问题记录 1、vue引入vue vue的大致形式如下: <template> </template> <script> </script> <style> </style>复制 要引入其他vue,需要import <template> <div> <Header></Header> <Carous></Carous> <SaleNumber></SaleNumber> <ShopList></ShopList> <Footer></Footer> </div> </template> <script> importShopListfrom'@/components/Sh

  • 跳出循环

    break --停止循环 打印1-10的循环,带上break语句就会立刻停止循环 a=1 whilea<=10 print(a) break--遇到了break,立刻终止循环,break后面的代码,不再继续执行 a+=1 print(a)复制 打印1-10的循环,带上continue语句就会立刻停止循环 a=1 whilea<=10 print(a) continue--终止这一次的循环,马上开始下一次循环 a+=1 print(a)复制     猜数字游戏: 1.让用户输入一个整数,去判断用户输入的整数,是否以程序设置(8)一直致 2.告诉用户:小了、大了、猜对了   1.建一个变量=存放接收用户的输入 a=input('请输入一个整数') 2.因为input()接收的内容,都会自动化转换成字符串,所以我们需要手动去转换成整数 a=int(a)--把右边的input()转换成整数,在赋值给变量a ifa==8:   print('猜对了') elifa<8:   print(

  • 查看apache当前并发访问数和进程数

    1、查看apache当前并发访问数: netstat-an|grepESTABLISHED|wc-l对比httpd.conf中MaxClients的数字差距多少。2、查看有多少个进程数:psaux|grephttpd|wc-l3、可以使用如下参数查看数据server-status?auto#ps-ef|grephttpd|wc-l1388统计httpd进程数,连个请求会启动一个进程,使用于Apache服务器。表示Apache能够处理1388个并发请求,这个值Apache可根据负载情况自动调整。#netstat-nat|grep-i"80"|wc-l4341netstat-an会打印系统当前网络链接状态,而grep-i"80"是用来提取与80端口有关的连接的,wc-l进行连接数统计。最终返回的数字就是当前所有80端口的请求总数。#netstat-na|grepESTABLISHED|wc-l376netstat-an会打印系统当前网络链接状态,而grepESTABLISHED提取出已建立连接的信息。然后wc-l统计。最终返回的数字就是当前所有80端口的已建立连接的总数。netstat-n

相关推荐

推荐阅读