设计模式
文章平均质量分 80
本专栏参考链接:http://c.biancheng.net/design_pattern/
你好像很好吃a
吃不了自律的苦,就要吃平庸的苦。
展开
-
设计模式系列【24】:装饰器模式(装饰设计模式)详解
上班族大多都有睡懒觉的习惯,每天早上上班时间都很紧张,于是很多人为了多睡一会,就会用方便的方式解决早餐问题。有些人早餐可能会吃煎饼,煎饼中可以加鸡蛋,也可以加香肠,但是不管怎么"加码",都还是一个煎饼。在现实生活中,常常需要对现有产品增加新的功能或美化其外观,如房子装修、相片加相框等,都是装饰器模式。在软件开发过程中,有时想用一些现存的组件。这些组件可能只是完成了一些核心功能。但在不改变其结构的情况下,可以动态地扩展其功能。所有这些都可以采用装饰器模式来实现。装饰器模式的定义与特点装饰器(Decora原创 2022-01-13 23:35:16 · 700 阅读 · 0 评论 -
设计模式系列【23】:桥接模式(Bridge模式)详解
在现实生活中,某些类具有两个或多个维度的变化,如图形既可以按形状分,又可按颜色分。如何设计类似于Photoshop这样的软件,能画不同形状和不同颜色的图形呢?如果用继承方式,m种形状和n种颜色的图形就有m × n种,不但对应的子类很多,而且扩展困难。当然,这样的例子还有很多,如不同颜色和字体的文字,不同品牌和功率的汽车、不同性别和职业的男女、支持不同平台和不同文件格式的媒体播放器等。如果用桥接模式就能很好的理解这样的问题。桥接模式的定义与特点...原创 2022-01-10 22:59:30 · 1784 阅读 · 0 评论 -
设计模式系列【22】:适配器模式(Adapter模式)详解
在现实生活中,经常出现两个对象因接口不兼容而不能在一起工作的实例,这时需要第三者进行适配。例如,讲中文的人同讲英文的人对话时需要一个翻译,用直流电的笔记本接交流电源时需要一个电源适配器,用计算机访问照相机的SD内存卡时需要一个读卡器等。在软件设计中也可能出现:需要开发的具有某种业务功能的组件在现有组件库中已经存在,但它们与当前系统的接口的规范不兼容,如果重新开发这些组件成本又高,这时用适配器模式能很好地解决这些问题。模式的定义与特点适配器模式(Adapter)的定义如下:将一个类的接口转换成客户希望的原创 2021-08-19 17:32:03 · 711 阅读 · 0 评论 -
设计模式系列【21】:代理模式(代理设计模式)详解
在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象。例如,购买火车票不一定要去火车站买,可以通过12306网站或者去火车票代售点买。又如找女朋友、找保姆、找工作等都可以通过中介完成。在软件设计中,使用代理模式的例子很多,例如,要访问的远程对象比较大(如视频或者大图像等),其下载要花很多时间。还有因为安全原因需要屏蔽客户端直接访问真实对象,如某单位内部数据等。代理模式的定义与特点代理模式的定义:由于某些原因需要给某对象提供一个代理以控制对该对象原创 2021-08-19 11:12:09 · 299 阅读 · 0 评论 -
设计模式系列【20】:结构型模式概述(结构型模式的分类)
结构型模式描述如何将类或对象按照某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者采用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足"合成复用原则",所以对象结构型模式比类结构型模式具有更大的灵活性。结构型模式分为以下7种:代理(Proxy)模式:为某对象提供一种代理以控制对该对象的访问。即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性。适配器(Adapter)模式:将一个类的接口转换成客户希望的另外一个接口原创 2021-08-18 16:57:11 · 433 阅读 · 0 评论 -
设计模式系列【19】:建造者模式(Builder模式)
在软件开发过程中有时需要创建一个复杂对象,这个复杂对象通常由多个子部件按一定的步骤组合而成。例如,计算机是由CPU、主板、内存、硬盘、显卡、机箱、显示器、鼠标等部件组装而成的,采购员不可能自己去组装计算机,而是将计算机的配置要求告诉计算机销售公司,计算机销售公司安排技术人员去组装计算机,然后再交给卖计算机的采购员。生活中这样的例子很多,如游戏中的不同角色,其性别、个性、能力、脸型、服装、发型等特性都有差异;还有汽车中的方向盘、发动机、车架、轮胎等部件也多种多样;每封邮件的发件人、收件人、主题、内容、附件等原创 2021-08-18 16:21:19 · 366 阅读 · 0 评论 -
设计模式系列【18】:抽象工厂模式
前面介绍的工厂方法模式中考虑的是一类产品的生产,如畜牧场只养动物、电视机厂只生产电视机、计算机软件学院只培养计算机软件专业的学生等。同种类称为同等级,也就是说:工厂方法模式只考虑生产同等级的产品,但是在现实生活中许多工厂是综合型工厂,能生产多等级(种类)的产品,如农场里既养动物又养植物,电器厂既生产电视机又生产洗衣机或空调,大学既有软件专业又有生物专业等。本节要介绍的抽象工厂模式将考虑多等级产品的生产,将同一个具体工厂所生产的位于不同等级的一组产品称为一个产品族,下图所示的是海尔工厂和TCL工厂所生产的原创 2021-07-05 15:59:40 · 386 阅读 · 2 评论 -
设计模式系列【17】:工厂方法模式
在显示生活中社会分工越来越细,越来越专业化。各种产品有专门的工厂生产,彻底告别了自给自足的小农经济时代,这大大缩短了产品的生产周期,提高了生产效率。同样,在软件开发中能否做到软件对象的生产和使用相分离呢?能否在满足"开闭原则"的前提下,客户所以增删或改变对软件相关对象的使用呢?这就是本节要讨论的问题。在《简单工厂模式》一节我们介绍了简单工厂模式,提到了简单共产模式违背了开闭原则,而 “工厂方法模式” 是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则。原创 2021-07-05 14:36:35 · 149 阅读 · 0 评论 -
设计模式系列【16】:简单工厂模式
现实生活中,原始社会自给自足(没有工厂),农耕社会小作坊(简单工厂,民间酒窖),工业革命流水线(工厂方法,自产自销),现代产业链代工厂(抽象工厂,富士康)。我们的项目代码同样是由简到繁一步一步迭代而来的,但对于调用者来说,却越来越简单。在日常开发中,凡是需要生成复杂对象的地方,都可以尝试考虑使用工厂模式来代替。注意:上述复杂对象指的是类的构造函数参数过多等对类的构造有影响的情况,因为类的构造过于复杂,如果直接在其它业务类内使用,则两者的耦合过重,后续业务更改,就需要在任何引用该类的源代码内进行更改,光原创 2021-07-05 10:54:12 · 185 阅读 · 0 评论 -
设计模式系列【15】:原型模式(原型设计模式)详解
在有些系统中,存在大量相同或相似对象的创建问题,如果传统的构造函数来创建对象,会比较复杂且耗时耗资源,用原型模式生成的对象就很高效,就像孙悟空拔下猴毛轻轻一吹就变出了很多孙悟空一样简单。一、原型模式的定义与特点原型(Prototype)模式是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供一种创建对象的最佳方式。用这种方式创建的对象非常高效,根本无须知道对象创建的细节。例如,Windows操作系统的安装通常较耗时,如果复制就快了很多。用原型实例指定创建对象的种类,并通过拷原创 2021-06-17 10:51:01 · 1240 阅读 · 1 评论 -
设计模式系列【14】:单例模式(单例设计模式)详解
在有些系统中,为了节省内存资源、保证数据内容的一致性,对某些类要求只能创建一个实例,这就是所谓的单例模式。一、单例模式的定义与特点单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。例如,Windows只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各个窗口显示内容的不一致等错误。在计算机系统中,还有Windows的回收站、操作系统中的文件系统、多线程中的线程池、显卡的驱动程序对象、打印机的后台处理服务、应用程序的日志原创 2021-06-16 14:46:45 · 449 阅读 · 0 评论 -
设计模式系列【13】:创建型模式的特点和分类
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节,对象的创建由相关的工厂来完成。就像我们去商场购买商品时,不需要知道商品是怎么生产的一样,因为它们由专门的厂商生产。创建型模式分为以下几种:单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式;原型(Prototype)模式:将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例;原创 2021-06-16 11:13:05 · 230 阅读 · 0 评论 -
设计模式系列【12】:一句话总结软件设计七大原则
结合前几节的内容,我们一共介绍了7中设计原则,它们分别是开闭原则、里式替换原则、依赖倒置原则、单一职责原则、接口隔离原则、迪米特法则和合成复用原则。这7中设计原则是软件设计模式必须遵循的原则,是设计模式的基础。在实际开发过程中,并不是一定要求所有代码都遵循设计原则,而是要综合考虑人力、时间、成本、质量,不刻意追求完美,要在适当的场景下遵循设计原则。这体现了一种平衡取舍,刻意帮助我们设计出更加优雅的代码结构。各种原则要求的侧重点不同,下面我们分别于用一句话归纳总结软件设计模式的七大原则,如下表所示:原创 2021-06-16 10:35:19 · 199 阅读 · 0 评论 -
设计模式系列【11】:合成复用原则——面向对象设计原则
一、合成复用原则的定义合成复用原则(Composite Reuse Principle,CRP)又叫组合/聚合复用原则(Composition/Aggregate Reuse Principle,CARP)。它要求在软件复用时,要尽量先使用组合或聚合等关联关系来实现,其次才考虑使用继承关系来实现。如果要使用继承关系,则必须严格遵循里氏替换原则。合成复用原则同里氏替换原则相辅相成的,两者都是开闭原则的具体实现规范。二、合成复用原则的重要性通常类的复用分为继承复用和合成复用两种,继承复用虽然有简单和易实原创 2021-06-16 10:15:00 · 157 阅读 · 0 评论 -
设计模式系列【十】:迪米特法则——面向对象设计原则
一、迪米特法则的定义迪米特法则(Law of Demeter,LoD)又叫最少知识原则(Least Knowledge Principle,LKP),产生于1987年美国东北大学(Northeastern University)的一名为迪米特(Demeter)的研究项目,由伊恩·荷兰(Ian Holland)提出,被 UML 创始者之一的布奇(Booch)普及,后来又因为在经典著作《程序员修炼之道》(The Pragmatic Programmer)提及而广为人知。迪米特法则的定义是:只与你的直接朋友交原创 2021-06-16 09:52:21 · 219 阅读 · 0 评论 -
设计模式系列【九】:接口隔离原则——面向对象设计原则
一、接口隔离原则的定义接口隔离原则(Interface Segregation Principle,ISP)要求程序员尽量将臃肿庞大的接口拆分成更小的和更具体的接口,让接口中只包含客户感兴趣的方法。2002 年罗伯特·C.马丁给“接口隔离原则”的定义是:客户端不应该被迫依赖于它不使用的方法(Clients should not be forced to depend on methods they do not use)。该原则还有另外一个定义:一个类对另一个类的依赖应该建立在最小的接口上(The de原创 2021-06-16 09:31:07 · 95 阅读 · 0 评论 -
设计模式系列【八】:单一职责原则——面向对象设计原则
单一职责原则也是面向对象设计原则中的一条,下面我们就来详细地对其进行介绍。一、单一职责原则的定义单一职责原则(Single Responsibility Principle,SRP)又称单一功能原则,由罗伯特·C.马丁(Robert C. Martin)于《敏捷软件开发:原则、模式和实践》一书中提出的。这里的职责是指类变化的原因,单一职责原则规定一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分(There should never be more than one reason for a cl原创 2021-06-15 18:19:55 · 188 阅读 · 0 评论 -
设计模式系列【七】:依赖倒置原则——面向对象设计原则
前两节我们详细介绍了面向对象设计原则中的开闭原则和里氏替换原则,在本节中我们来介绍依赖倒置原则。一、依赖倒置原则的定义依赖倒置原则(Dependence Inversion Principle,DIP)是Object Mentor公司总裁罗伯特·马丁(Robert.C.Martin)于1996年在C++ Report上发表的文章。依赖倒置原则的原始定义为:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象(High level modules should notd原创 2021-06-15 18:01:12 · 274 阅读 · 0 评论 -
设计模式系列【六】:里氏替换原则——面向对象设计原则
在上一节开闭原则中,我们详细介绍了开闭原则,本节我们来介绍里式替换原则。一、里式替换原则的定义里式替换原则(Liskov Substitution Principle,LSP)由麻省理工学院计算机科学实验室的里斯科夫(Liskov)女士在1987年的“面向对象技术的高峰会议”(OOPSLA)上发表的一篇文章《数据抽象和层次》(Data Abstract and Hierarchy)里提出来的,她提出:继承必须确保超类所拥有的性质在子类中仍然成立(Inheritance should ensure tha原创 2021-06-15 17:23:39 · 314 阅读 · 1 评论 -
设计模式系列【五】:开闭原则——面向对象设计原则
一、开闭原则——面向对象设计原则在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据7条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。我们将在下面的几节中依次来介绍这7条原则,本节首先介绍开闭原则。二、开闭原则的定义开闭原则(Open Closed Principle,OCP)由波兰特·梅耶(Bertrand Meyer)提出,他在1988年的著作《面向对象软件构造》(Object Oriented Software Constructi原创 2021-06-15 16:31:17 · 234 阅读 · 0 评论 -
设计模式系列【四】:如何正确使用设计模式?
设计模式不是为每个人准备的,而是基于业务来选择设计模式,需要时就能想到它。要明白一点,技术永远为业务服务,技术只是满足业务需要的一个工具。我们需要掌握每种设计模式的应用场景、特征、优缺点,以及每种设计模式的关联关系,这样就能很好地满足日常业务的需要。许多设计模式的功能类似,界限不是特别清楚(为了能让大家更好的理解,每个章节后面都列出了类似功能设计模式之间的对比)。大家不要疑惑,设计模式不是为了特定场景而生的,而是为了让大家可以更好和更快地开发。设计模式只是实现了七大设计原则的具体方式,套用太多设计模式只原创 2021-06-15 15:42:40 · 270 阅读 · 1 评论 -
设计模式系列【三】:什么才是优秀的软件架构?
开始学习设计模式前,我们先来看看软件架构的设计过程,及需要达成的目标和尽量避免的陷阱。代码复用无论是开发哪种软件产品,成本和时间都是最重要的。较少的开发时间意味着可以比竞争对手更早的进入市场。较低的开发成本意味着能够留出更多的营销资金,覆盖更广泛的潜在客户。其中,代码复用是减少开发成本最常用的方式之一,其目的是非常明显,即:与其反复从头开发,不如在新对象中重用已有的代码。这个想法表面看起来很棒,但实际上要让已有的代码在全新的代码中工作,还是需要额外努力的。组件间紧密的耦合、对具体类而非接口的依赖和硬原创 2021-06-15 15:12:40 · 282 阅读 · 0 评论 -
设计模式系列【二】:GoF的23种设计模式的分类和功能
设计模式有两种分类方法,即根据模式的目的来分和根据模式的作用的范围来分。1.根据目的来分:根据模式是用来完成什么工作来分,这种方式可分为创建型模式、结构型模式和行为型模式3种。创建型模式:用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。GoF 中提供了单例、原型、工厂方法、抽象工厂、建造者等 5 种创建型模式。结构型模式:用于描述如何将类或对象按某种布局组成更大的结构,GoF 中提供了代理、适配器、桥接、装饰、外观、享元、组合等 7 种结构型模式。行为型模式:用于描述类或对象原创 2021-06-15 11:15:54 · 238 阅读 · 0 评论 -
设计模式系列【一】:软件设计模式概念
设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规则,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。1995年,GoF(Gang of Four,四人组/四人帮)合作出版了《设计模式:可复用面向对象软件的基础》一书,共收录了23种设计模式,从此树立了软件设计模式领域的里程碑,人称「GoF设计模式」。这23中设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性,以及类的关联关系和组合关系的充分原创 2021-06-15 09:48:05 · 465 阅读 · 1 评论