锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

23种设计模式

时间:2023-02-12 04:30:01 m23系列圆形连接器

一、设计模式的来源

设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。

1995 年,GoF(Gang of Four,四人组/四人帮)合作出版了《设计模式:面向对象软件的基础可复用》一书,共收录 23 从那时起,软件设计模式领域的里程碑就建立起来了「GoF设计模式」。

二、设计模式六大原则(SOLID)

一般原则-开闭原则(Open Closed Principle)

软件实体,如类、模块和函数,应该是扩大开放,关闭修改

当程序需要扩展时,不能修改原始代码,而是扩展原始代码,以达到热插拔的效果。因此,一句话是:为了使程序具有良好的可扩展性,易于维护和升级。

要达到这种效果,我们需要使用界面和抽象类。

一、单一职责原则(Single Responsibility Principle)

一个类别应该只有一个变化的原因。

不要有更多的原因导致类变化,也就是说,每个类都应该实现单一的责任,否则就应该分类。

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

所有引用基类的地方必须能够透明地使用其子类对象。

子类必须出现在任何基本类别可以出现的地方。里氏替代原则是继承和重复使用的基石。只有当衍生替换基本类别,软件单位的功能不受影响时,基本类别才能真正重用,衍生物也可以在基本类别的基础上增加新的行为。

里氏替代原则是对开闭原则的补充。实现开闭原则的关键步骤是抽象化。基与子类的继承关系是抽象的具体实现,因此里氏替代原则是抽象实现的具体步骤的标准。在里氏替代原则中,尽量不要重写和重载子类对父类的方法。因为父类代表了一个定义的结构,子类不应该通过这个标准的界面与外界互动来破坏它。

3.依靠倒置原则(Dependence Inversion Principle)

1.上层模块不应依赖底层模块,而应依赖抽象。 抽象不应依赖于细节,细节应依赖于抽象。

面向接口编程取决于抽象而不是具体。编写代码时,使用特定类别时,不与特定类别交互,而是与特定类别的上层接口交互。

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

客户端不应依赖其不必要的接口。 2.类间的依赖应以最小接口为基础。

每个接口中没有子类不能使用但必须实现的方法。如果没有,则应拆分接口。使用多个隔离接口比使用单个接口(多个接口方法集成到一个接口)要好。

5.迪米特法则(至少知道原则)(Law of Demeter)

只和你的直接朋友说话,不和陌生人说话。

一个类对自己依赖的类知之甚少。无论依赖的类别有多复杂,逻辑都应该包装在方法的内部,通过public方法提供给外部。这样当被依赖的类变化时,才能最小的影响该类。

至少知道原则的另一种表达方式是只与直接的朋友交流。只要类之间有耦合关系,它就被称为朋友关系。耦合分为依赖、关联、聚合、组合等。我们称之为成员变量、方法参数和方法返回值中的直接朋友。局部变量和临时变量不是直接的朋友。我们要求不熟悉的类别不要作为局部变量出现在类别中。

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

尽量使用对象组合/聚合,而不是继承关系达到软件复用的目的。

合成或聚合可以将现有对象纳入新对象,使其成为新对象的一部分,因此新对象可以调用现有对象的功能。

记忆口诀:SOLID CD(稳固的CD)。

三、三类设计模式

创建型模式(Creational Pattern):抽象了对类的实例化过程,可以在软件模块中抽象对象的创建与对象的使用分离。

工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式

记忆公式:原创单建抽(创公园,但见愁)

结构型模式(Structural Pattern):关注对象的组成和对象之间的依赖,描述如何将类或对象结合在一起形成更大的结构,就像搭积木,复杂、功能更强大的结构可以通过简单积木的组合形成。

(7)适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式

记忆公式:结享外组适代装桥(姐姐想外租,世代装桥)

行为型模式(Behavioral Pattern):关注对象的行为是对不同对象之间责任和算法划分的抽象;不仅关注类别和对象的结构,而且关注它们之间相互作用

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

记忆公式:模仿行状责中的备观策命迭形状折中模仿,戒备观测鸣笛)

四、二十三种设计模式

---------------------创建型模式---------------------

工厂模式

工厂模式(Factory Pattern)是Java最常用的设计模式之一。

在工厂模式下,我们在创建对象时不会暴露创建逻辑,而是使用共同接口指向新创建的对象。

定义创建对象的接口,让子类决定实例化哪个工厂类,工厂模式将其创建过程延迟到子类。

应用实例:您需要一辆汽车,可以直接从工厂提货,而不管汽车是如何制造的,以及汽车的具体实现。至于你需要哪个品牌的车,去哪个品牌的工厂。

抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)其他工厂是围绕一个超级工厂建造的。超级工厂也被称为其他工厂。

在抽象工厂模式中,接口是负责创建相关对象的工厂,无需明确指定其类别。每个生产的工厂都可以根据工厂模式提供对象。

在不指定具体类别的情况下,为创建一系列相关或相互依赖的口。

应用实例:对于一个家庭来说,商务女装、商务男装、时尚女装、时尚男装都是成套的,即一系列具体产品。假设在某种情况下,在你的家里,衣柜(特定的工厂)只能储存这样的衣服(成套,一系列特定的产品),每次你拿这套衣服自然会从衣柜里拿出来。用 OO 理解,所有衣柜(特定工厂)都是衣柜(抽象工厂),每套衣服包括特定夹克(特定产品)、裤子(特定产品),这些特定夹克实际上是夹克(抽象产品),特定裤子也是裤子(另一种抽象产品)。

单例模式

单例模式(Singleton Pattern)是Java最简单的设计模式之一。

该模型涉及一个负责创建自己对象的单一类别,并确保只创建单个对象。该类别提供了一种直接访问的方式,而无需实例化。

确保一个类只有一个例子,并提供一个访问它的全球访问点。

应用实例:一个班只能有一个班主任。

建造者模式(建造者模式)

建造者模式(Builder Pattern)使用多个简单的对象逐步构建复杂的对象。

一个Builder类别将逐步构建最终对象。Builder类别是独立于其他对象的。

将复杂的结构与其表示分开,使相同的结构过程能够创造不同的表示。

应用实例: 去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而且它们的组合经常变化,生成所谓的套餐; 2、Java 中的 StringBuilder。

原型模式

原型模式(Prototype Pattern)它用于创建重复对象,同时保证性能。

该模型实现了一个用于创建当前对象的克隆的原型接口。当直接创建对象的成本相对较高时,使用此模型。例如,在高成本数据库操作后,需要创建一个对象。我们可以在下一个请求中缓存对象,返回其克隆,并在必要时更新数据库,以减少数据库调用。

用原型实例指定创建对象的类型,并通过复制这些原型创建新对象。

应用实例: 1、细胞分裂; 2、Java中的 Object clone() 方法。

---------------------结构型模式---------------------

适配器模式

适配器模式(Adapter Pattern)是两个不兼容接口之间的桥梁。

该模型涉及一个负责添加独立或不兼容接口功能的单一类别。

<>将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

应用实例: 1、读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡; 2、美国电器110V,中国220V,就要有一个变压器将110V转化为220V。

装饰器模式

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。

应用实例: 1、孙悟空有72变,当他变成"庙宇"后,他的根本还是一只猴子,但是他又有了庙宇的功能; 2、将一个形状装饰上不同的颜色,同时又不改变形状。

代理模式

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。

在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。

为其他对象提供一种代理以控制对这个对象的访问。

应用实例: 1、Windows里面的快捷方式; 2、买火车票不一定在火车站买,也可以去代售点; 3、一张支票或银行存单是账户中资金的代理。支票在市场交易中用来代替现金,并提供对签发人账号上资金的控制; 4、Spring AOP。

注意事项:

1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。

2、和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。

外观模式

外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。

这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。

为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

应用实例: 去医院看病,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便。

桥接模式

桥接模式(Bridge Pattern)是用于把抽象化与实现化解耦,使得二者可以独立变化。它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。

这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。

将抽象部分与实现部分分离,使它们都可以独立的变化。

又称为柄体(Handle and Body)模式或接口(Interface)模式。

应用实例: 1、猪八戒从天蓬元帅转世投胎到猪,转世投胎的机制将尘世划分为两个等级,即:灵魂和肉体,前者相当于抽象化,后者相当于实现化。生灵通过功能的委派,调用肉体对象的功能,使得生灵可以动态地选择; 2、墙上的开关,可以看到的开关是抽象的,不用管里面具体怎么实现的; 3、如果要绘制不同的颜色,如红色、绿色、蓝色的矩形、圆形、椭圆、正方形,我们需要根据实际需要对形状和颜色进行组合,那么颜色、形状就是抽象部分,组合后的就是实现部分。

注意事项:对于两个独立变化的维度,使用桥接模式再适合不过了。

组合模式

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构

这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。

将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

应用实例: 1、算术表达式包括操作数、操作符和另一个操作数,其中,另一个操作数也可以是操作数、操作符和另一个操作数。 2、在JAVAAWT和SWING中,对于Button和Checkbox是树叶,Container是树枝。

享元模式

享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。

享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。

运用共享技术有效地支持大量细粒度的对象。

应用实例: 1、Java中的String,如果有则返回,如果没有则创建一个字符串保存在字符串缓存池里面; 2、数据库的数据池。

---------------------行为型模式---------------------

策略模式

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。

在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的context对象。策略对象改变context对象的执行算法。

定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。

应用实例: 1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略; 2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。

模板模式

在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

应用实例: 1、在造房子的时候,地基、走线、水管都一样,只有在建筑的后期才有加壁橱加栅栏等差异; 2、西游记里面菩萨定好的81难,这就是一个顶层的逻辑骨架; 3、spring中对Hibernate的支持,将一些已经定好的方法封装起来,比如开启事务、获取Session、关闭Session等,程序员不重复写那些已经规范好的代码,直接丢一个实体就可以保存。

观察者模式

当对象间存在一对多关系时,则使用观察者模式(ObserverPattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

应用实例: 1、拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价; 2、西游记里面悟空请求菩萨降服红孩儿,菩萨洒了一地水招来一个老乌龟,这个乌龟就是观察者,他观察菩萨洒水这个动作。

迭代器模式

迭代器模式(Iterator Pattern)是Java和.Net编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。

迭代器模式属于行为型模式。

提供一种方法顺序访问一个聚合对象中各个元素,而又无须暴露该对象的内部表示。

应用实例:JAVA中的iterator。

责任链模式

顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。

在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

应用实例:红楼梦中的"击鼓传花"。

命令模式

命令模式(Command Pattern)是一种数据驱动的设计模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。

将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。

应用实例:电视机是请求的接收者,遥控器是请求的发送者,遥控器上有一些按钮,不同的按钮对应电视机的不同操作。抽象命令角色由一个命令接口来扮演,有三个具体的命令类实现了抽象命令接口,这三个具体命令类分别代表三种操作:打开电视机、关闭电视机和切换频道。

备忘录模式

备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

应用实例: 1、后悔药; 2、打游戏时的存档; 3、Windows里的ctri+z; 4、IE中的后退; 5、数据库的事务管理。

状态模式

在状态模式(State Pattern)中,类的行为是基于它的状态改变的。

在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的context对象。

允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。

应用实例: 1、打篮球的时候运动员可以有正常状态、不正常状态和超常状态; 2、曾侯乙编钟中,'钟是抽象接口','钟A'等是具体状态,'曾侯乙编钟'是具体环境(Context)。

访问者模式

在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。

主要将数据结构与数据操作分离。

主要解决:稳定的数据结构和易变的操作耦合问题。

应用实例:您在朋友家做客,您是访问者,朋友接受您的访问,您通过朋友的描述,然后对朋友的描述做出一个判断,这就是访问者模式。

中介者模式

中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。

用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

应用实例: 1、中国加入WTO之前是各个国家相互贸易,结构复杂,现在是各个国家通过WTO来互相贸易; 2、机场调度系统; 3、MVC框架,其中C(控制器)就是M(模型)和V(视图)的中介者。

解释器模式

解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在SQL解析、符号处理引擎等。

给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。

应用实例:编译器、运算表达式计算。

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章