【从入门到放弃】23种设计模式(1):设计模式综述

一、设计模式的分类

总体来说设计模式分为三大类:

创建型模式,共五种:工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、单例模式(Singleton)、建造者模式(Builder)、原型模式(Prototype)。

结构型模式,共七种:适配器模式(Adapter)、装饰器模式(Decorator)、代理模式(Proxy)、外观模式(Facade)、桥接模式(Bridge)、组合模式(Composite)、享元模式(Flyweight)。

行为型模式,共十一种:策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、迭代器模式(Iterator)、责任链模式(Chain Of Responsibility)、命令模式(Command)、备忘录模式(Memento)、状态模式(State)、访问者模式(Visitor)、中介者模式(Mediator)、解释器模式(Interpreter)。

其实还有两类:并发型模式和线程池模式。用一个图片来整体描述一下:

下面对23中这几模式做一个简介:

抽象工厂模式(AbstractFactory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
桥接模式(Bridge):将抽象部分与它的实现部分分离,使它们都可以独立地变化。
建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
责任链模式(Chain of Responsibility):为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。
命令模式(Command):将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。
组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得客户对单个对象和复合对象的使用具有一致性。
装饰器模式(Decorator):动态地给一个对象添加一些额外的职责。就扩展功能而言,Decorator模式比生成子类方式更为灵活。
外观模式(Facade):为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定将哪一个类实例化。FactoryMethod使一个类的实例化延迟到其子类。
享元模式(Flyweight):运用共享技术有效地支持大量细粒度的对象。
解释器模式(Interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。
中介者模式(Mediator):用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。
观察者模式(Observer):定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。
原型模式(Prototype):用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。
代理模式(Proxy):为其他对象提供一个代理以控制对这个对象的访问。
单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点。
状态模式(State):允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。
策略模式(Strategy):定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。
模板方法模式(Template Method):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

 

二、设计模式的六大原则

总原则:开闭原则(Open Close Principle)

开闭原则就是说对扩展开放,对修改关闭。在程序需要进行扩展的时候,不能去修改原有的代码,而是要扩展原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了程序的扩展型好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类等,后面的具体设计中我们会提到点。

1、单一职责原则

不要存在多于一个导致类变更的原因,也就是说每个类应该实现单一的职责,如若不然,就应该把类拆分。

2、里氏替换原则(Liskov Substitution Principle)

里氏替换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。里氏替换原则中说,人和积累可以出现的地方,子类一定可以出现。LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏替换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏替换原则是对实现抽象化的具体步骤的规范。

里氏替换原则中,子类对父类的方法尽量不要重写和重载。因为父类代表了定义好的结构,通过这个规范的接口与外界交互,子类不应该随便破坏它。

3、依赖倒转原则(Dependence Inversion Principle)

这个是开闭原则的基础,具体内容:面向接口编程,依赖于抽象而不依赖于具体。写代码时用到具体类时,不与具体类交互,而与具体类的上层接口交互。

4、接口隔离原则(Interface Segregation Principle)

这个原则的意思是:每个接口不存在子类用不到却必须实现的方法,如果不然,就要将接口拆分。使用多个隔离的接口,比使用单个接口(多个接口方法集合到一个的接口)要好。

5、迪米特法则(最少知道原则)(Demeter Principle)

就是说:一个类对自己依赖的类知道的越少越好。也就是说无论被依赖的类多么复杂,都应该将逻辑封装到方法的内部,通过public方法提供给外部。这样当依赖的类变化时,才能最小的影响该类。最小知道原则的另一个表达方式是:只给直接的朋友通信。类之间只要有耦合关系,就叫朋友关系。耦合分为依赖、关联、聚合、组合等。我们称出现的成员变量、方法参数、方法返回值中的类为直接朋友。局部变量、临时变量则不是直接的朋友。我们要求陌生的类不要作为局部变量出现在类中。

6、合成复用原则(Composite Reuse Principle)

原则是尽量首先使用合成/聚合的方式,而不是使用继承。

 

转载于:https://www.cnblogs.com/cheney256/articles/9004988.html

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

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

相关文章

【2017级面向对象程序设计】第2次成绩排行

作业地址 https://edu.cnblogs.com/campus/fzu/OOP/homework/1864 评分标准 1) C 流程图 or 文字描述程序结构 5分C 类图 or 文字描述程序结构 5分2) 代码 共 10 分构造函数 :2 分析构函数 :2 分成员函数 显示当前所处楼层&#x…

css定位position

闲言碎语不多说,直接开写! 关于定位 我们可以使用css的position属性来设置元素定位类型,position的设置项如下: a、relative生成相对定位元素,元素所占据的文档流的位置不变(即元素不会脱离文档流&#x…

php运城,运城php培训

作用域:全局的request恳求   描绘:经过在Global中完成Application_Error办法,来到达侦听未经处置的异常   详细代码如下:sudo dtrace -qFn pid$target:Finding?Ray:Finding?Ray:r{ printf("%s\n", probefunc); } …

利用爬虫模拟网页微信wechat

1.登录页面,显示二维码 当我们打开网页微信时,会看到一个用于扫码登录的二维码,所以我们要模拟该页面给我们的页面也弄一个二维码 通过查看网页代码我们发现,这个二维码的标签为 这个src属性的最后一段每次访问都是不同的&#xf…

爬取饿了么商铺信息

分析: 当我们访问https://www.ele.me/home/时,看看我们得到了什么 1.png我们发现所有的城市名称和他的经纬度,还有一个风流的男子 然后随机输入一些东西看看,进入某个地区看一看 在新的界面里我们看到了这样一条url: https://main…

linux基本命令du,Linux常用操作命令汇总

你还在为不知道Linux常用操作命令汇总而不知所措么?下面来是学习啦小编为大家收集的Linux常用操作命令汇总,欢迎大家阅读:Linux常用操作命令汇总1.ls 命令ls以默认方式显示当前目录文件列表服务器教程ls -a显示所有文件包括隐藏文件ls -l显示文件属性&a…

后处理效果栈

Unity官方的Github实现:Post Processing Stack Post-processing is the process of applying full-screen filters and effects to a camera’s image buffer before it is displayed to screen. It can drastically improve the visuals of your product with litt…

linux 安装tcl命令,TCL/TK Linux下安装 | 勤奋的小青蛙

原创文章,转载请注明: 转载自勤奋的小青蛙本文链接地址: TCL/TK Linux下安装在Linux下安装TCL/TK,可以有编译源代码的方式安装,也可以有直接通过二进制压缩包进行解压缩安装,本文采用比较快捷的方式,用二进…

安全性中的Spring AOP –通过方面控制UI组件的创建

以下文章将显示在我参与的一个项目中,我们如何使用Spring的AOP来介绍一些与安全性相关的功能。 这样的概念是为了使用户能够看到一些UI组件,他需要具有一定级别的安全特权。 如果不满足该要求,则不会显示UIComponent。 让我们看一下项目结构&…

模拟生物自然进化的基因遗传算法

基因遗传算法(Genetic Algorithm,GA)是一种通过模拟生物进化过程来寻找最优解的优化算法。它是一种常见的启发式搜索算法,常用于优化、搜索和机器学习等领域。 生物基因遗传 生物的基因遗传是指父母通过基因传递给子代的过程。基因…

CSS学习笔记11 CSS背景

background-color:背景色 前面我们经常用background-color这个属性来设置元素的背景色,例如下面这条css可将段落的背景色设置为灰色 p {background-color: gray;} 如果想要元素的背景色向外延伸,则只需增加内边距即可 background-color可以为…

linux 文件的目录,Linux文件及目录管理

第七列:文件或目录名。名以 . 开头表示为隐藏文件或隐藏目录2.2 修改文件目录或者权限改变文件所属用户组:chgrpchgrp [-R] 用户组 文件或目录 ...[-R]:递归修改该目录下所有文件和目录;改变文件所有者:chownchown [-R…

套接字(linux相关)

前言:略 一、前因 一切从tcp、udp开始。 众所周知,网络模型一般有两种模型,一种为OSI概念模型(七层),另一种为TCP/IP网络模型(四层)。 TCP/IP应用层对应OSI的应用层、显示层、会话层…

linux查看进程运行日志文件,【Linux】常用指令、ps查看进程、kill杀进程、启动停止tomcat命令、查看日志、查看端口、find查找文件...

1.说出 10 个 linux 常用的指令1) ls 查看目录中的文件2)cd /home 进入 / home 目录;cd .. 返回上一级目录;cd ../.. 返回上两级目录3)mkdir dir1 创建一个叫做 dir1 的目录4)rmdir dir1 删除一个叫做 dir1 的目录 (只能删除空目录)5)rm -f file1 删除一…

Java PDF库

最近,我有一项任务是选择一些Java PDF库用于PDF生成。 但这不是一个简单的任务。 我想到的第一件事是iText。 众所周知Java库具有良好的声誉。 但是...有一些塞子。 iText 5版是在AGPL许可下发布的。 即,如果我们想在商业产品中使用iText,则必…

前端工程师必备的几个实用网站

一、配色类网站 http://colorhunt.co 这个网站给我们提供了很多的配色方案,我们直接使用就OK了。使用方法也很简单,鼠标移动到对应的颜色上,我们就可以看到颜色的十六进制码,复制这个颜色到工具里就可以使用了。 https://webgra…

linux 修改jmeter内存溢出,jmeter本机内存溢出如何修改?

websocket连接过程中内存溢出,本机配置的内存最大和最小设置的512;一、后台返回二、结果树返回:Thread Name: 线程组 1-9Sample Start: 2017-09-11 13:59:49 CSTLoad time: 9006Connect Time: 0Latency: 0Size in bytes: 0Sent bytes:0Header…

JSF:在传统组件和时尚性能杀手之间进行选择

这篇博客文章起源于一个大型Web应用程序中的性能问题。 每个人都优化Java代码,但似乎没有人尝试优化JavaScript代码。 奇怪,因为在客户端有很多改进的空间。 我会说,甚至比服务器端还要多。 我们将分析可编辑的JSF标准组件(有时称…

JS之 if语句函数 对接事件动作 函数更改css css对接需要换妆的区id或class

if 函数的实现步骤: function 名字() 指定id , 指定开关(display: none or block) if else 构成逻辑 控制开关 决定在哪里安置一个灯泡, 指定一个id给某个标签 把开关用电线连着灯泡, 安装开关 # id名称{ 属性1 赋值, 属性 2 赋值 , 属性3 赋值 } 所有的赋值都可以成为一…

小型Hadoop集群的Ganglia配置和一些故障排除

Ganglia是一个针对大型集群的开源,可扩展且分布式的监视系统。 它收集,汇总并提供数十种与计算机相关的指标(例如CPU,内存,存储,网络使用情况)的时序视图。 您可以在UC Berkeley Grid上看到Gang…