
23种设计模式
文章平均质量分 58
小风的笔记
这个作者很懒,什么都没留下…
展开
-
23种设计模式
23种设计模式分为创建型模式(5种)、结构型模式(7种)、行为型模式(11种)创建型模式:用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。原型(Prototype)模式:将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。工厂方法(Factory Method)模式:定义一个用于创建产品的接口,由子类决定生产什么产品。抽象工厂(Abstract原创 2021-09-07 19:14:58 · 241 阅读 · 0 评论 -
解释器模式(Interpreter Pattern)
解释器模式(Interpreter Pattern)优点:1、可扩展性比较好,灵活。2、增加了新的解释表达式的方式。3、易于实现简单方法。缺点:1、可利用场景比较少。2、对于复杂的文法比较难维护。3、解释器模式会引起类膨胀。4、解释器模式采用递归调用方法。例子:...原创 2021-09-07 19:14:10 · 232 阅读 · 1 评论 -
备忘录模式(Memento Pattern)
备忘录模式(保存一个对象的某个状态,以便在适当的时候恢复对象)优点1、提供了一种可以恢复状态的机制。可以使用户能够比较方便地回到某个历史的状态。2、实现了内部状态的封装。除了创建它的发起人之外,其他对象都不能够访问这些状态信息。3、发起人不需要管理状态信息,所有状态信息都保存在备忘录中,并由管理者进行管理。缺点1、资源消耗大。如果要保存的内部状态信息过多或者特别频繁,将会占用比较大的内存资源。备忘录模式主要角色发起人:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其原创 2021-09-02 11:39:31 · 262 阅读 · 0 评论 -
访问者模式(Visitor Pattern)
访问者模式(Visitor Pattern)访问者(Visitor)模式是一种对象行为型模式,其主要优点如下。扩展性好。能够在不修改对象结构中的元素的情况下,为对象结构中的元素添加新的功能。复用性好。可以通过访问者来定义整个对象结构通用的功能,从而提高系统的复用程度。灵活性好。访问者模式将数据结构与作用于结构上的操作解耦,使得操作集合可相对自由地演化而不影响系统的数据结构。符合单一职责原则。访问者模式把相关的行为封装在一起,构成一个访问者,使每一个访问者的功能都比较单一。访问者(Visitor)原创 2021-08-31 19:12:34 · 504 阅读 · 1 评论 -
中介者模式(Mediator Pattern)
中介者模式(用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互)优点:1、降低了类的复杂度,将一对多转化成了一对一。2、各个类之间的解耦。3、符合迪米特原则。缺点:-中介者会庞大,变得复杂难以维护。...原创 2021-08-26 18:50:28 · 306 阅读 · 0 评论 -
责任链模式(Chain of Responsibility Pattern)
责任链模式(避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止)优点:1、将请求发送者和接收者解耦,发送者和接收者也无须拥有对方的明确信息。2、当工作流程发生变化,可以动态地改变链内的成员或者调动它们的次序,动态地新增或者删除责任,增强了系统的可扩展性。3、避免了使用众多的 if 或者 if···else 语句。4、符合类的单一职责原则。缺点:1、请求没有明确的接收者,所原创 2021-08-24 15:22:40 · 877 阅读 · 0 评论 -
组合模式(Composite Pattern)
组合模式(Composite Pattern)组合模式分为透明组合模式和安全组合模式透明组合模式:抽象构件声明了所有子类中的全部方法,客户端无须区别树叶对象和树枝对象,对客户端来说是透明的。安全组合模式:将管理子构件的方法移到树枝构件中,抽象构件和树叶构件没有对子对象的管理方法,这样就避免了上一种方式的安全性问题。优点1、高层模块调用简单。2、节点自由增加。缺点1、设计较复杂,客户端需要花更多时间理清类之间的层次关系;2、不容易限制容器中的构件;3、不容易用继承的方法来增加构件的新功能原创 2021-08-23 17:00:05 · 459 阅读 · 0 评论 -
享元模式(Flyweight Pattern)
享元模式(运用共享技术有效的支持大量细粒度的对象)优点:大大减少对象的创建,降低系统的内存,使效率提高。缺点:提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱。享元模式的定义提出了两个要求,细粒度和共享对象。因为要求细粒度,所以不可避免地会使对象数量多且性质相近,此时我们就将这些对象的信息分为两个部分:内部状态和外部状态。内蕴状态存储在享元内部,不会随环境的改变而有所不同,是可以共享的。外蕴状态是不可以共享的,它原创 2021-08-21 02:04:31 · 470 阅读 · 0 评论 -
外观模式(Facade Pattern)
外观模式(为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式)优点1、子系统的变化不会影响调用它的客户类,降低了耦合度2、对客户屏蔽了子系统组件,客户调用起来更加容易,提高了灵活性和安全性。缺点1、增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。外观模式包含以下主要角色子系统角色:实现系统的部分功能,客户可以通过外观角色访问它。外观角色:为多个子系统对外提供一个共同的接口。客户角色:通过一个外观角色访问各个子系统的功能。外观模式的应用场景1原创 2021-08-20 01:35:40 · 327 阅读 · 0 评论 -
装饰器模式(Decorator Pattern)
装饰器模式(在不改变现有对象结构的情况下,动态扩展该对象的功能)优点:1、装饰类和被装饰类可以独立发展,不会相互耦合,2、装饰器是继承的有力补充,比继承更加灵活。3、装饰模式可以动态扩展一个实现类的功能。缺点:1、过度使用会增加许多子类,使程序比较复杂。装饰器模式主要包含以下角色抽象构件角色:定义一个抽象接口以规范准备接收附加责任的对象。具体构件角色:实现抽象构件,通过装饰角色为其添加一些职责。抽象装饰角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。具体装原创 2021-08-19 23:51:08 · 625 阅读 · 0 评论 -
桥接模式(Bridge Pattern)
桥接模式(将抽象与实现分离,使它们可以独立变化)桥接模式用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。优点:1、抽象与实现分离,扩展能力强。2、实现细节对客户透明。缺点:1、由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,能正确地识别出系统中两个独立变化的维度,这增加了系统的理解与设计难度。桥接模式包含以下主要角色抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。扩展抽象化(Refined Abstraction)角原创 2021-08-18 11:41:24 · 196 阅读 · 0 评论 -
适配器模式(Adapter Pattern)
适配器模式(将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作)适配器模式分为类结构型模式和对象结构型模式两种,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。优点1、可以让任何两个没有关联的类一起运行。2、复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类。3、客户端通过适配器可以透明地调用目标接口缺点1、过多使用适配器会使系统代码变得凌乱,增加代码阅读难度,降低代码可读性。适配器原创 2021-08-17 16:35:41 · 319 阅读 · 0 评论 -
代理模式(Proxy Pattern)
代理模式(为某对象提供一种代理以控制对该对象的访问。即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性)优点1、代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用。2、可以扩展目标对象的功能。3、将客户端与目标对象分离,降低耦合。缺点代理模式会造成系统设计中类的数量增加在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢;增加了系统的复杂度;...原创 2021-08-14 00:55:22 · 158 阅读 · 1 评论 -
建造者模式(Builder Pattern)
建造者模式(将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式)例子:一台电脑由主机、电脑显示器、键盘、鼠标四个部件组成,不同品牌电脑部件型号不同,类图如下:建造者模式的主要角色产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个零部件。抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。具体建造者(Concrete Bu原创 2021-08-13 01:28:49 · 175 阅读 · 0 评论 -
抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式(是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品)抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。...原创 2021-08-12 20:10:08 · 261 阅读 · 1 评论 -
工厂方法模式(Factory Pattern)
工厂方法模式(定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行)工厂方法模式是对简单工厂模式的进一步抽象化,可以使系统在不修改原来代码的情况下引进新的产品,满足开闭原则。优点:1、用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。3、典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。缺点:1、每原创 2021-08-11 14:22:49 · 916 阅读 · 0 评论 -
模板模式(Template Pattern)
模板模式(定义了一个算法的步骤,并允许子类为一个或多个步骤提供其实践方式。让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤)优点:1、利用模板方法将相同处理逻辑的代码放到抽象父类中,可以提高代码的复用性2、将不同的代码不同的子类中,通过对子类的扩展增加新的行为,提高代码的扩展性缺点:1、每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大2、继承关系自身缺点,如果父类添加新的抽象方法,所有子类都要改一遍使用场景:1、有多个子类共有的方法,且逻辑相同2、重要的原创 2021-08-09 15:49:22 · 4462 阅读 · 0 评论 -
迭代器模式(Iterator Pattern)
迭代器模式(提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示)优点访问一个聚合对象的内容而无须暴露它的内部表示。1、它支持以不同的方式遍历一个聚合对象。2、遍历任务交由迭代器完成,这简化了聚合类。3、在同一个聚合上可以有多个遍历。4、增加新的聚合类和迭代器类都很方便,无须修改原有代码。缺点1、由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。迭代器模式主要包含以下原创 2021-08-06 18:15:03 · 350 阅读 · 0 评论 -
观察者模式(Observer Pattern)
观察者模式(指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新)优点1、降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。符合依赖倒置原则。2、目标与观察者之间建立了一套触发机制。缺点1、目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用。2、当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。观察者模式的主要角色如下抽象目标角色:它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法原创 2021-08-03 13:06:58 · 155 阅读 · 0 评论 -
命令模式(Command Pattern)
命令模式(将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理)优点1、降低了系统耦合度。2、新的命令可以很容易添加到系统中去。缺点1、使用命令模式可能会导致某些系统有过多的具体命令类。命令模式包含以下主要角色抽象命令类角色:定义命令的接口,声明执行的方法。具体命令类角色:具体命令实现类,拥有接收者对象,并通过调用接收者的功能来完成命令要执行的操作。接收者角色:是真正执行命令的对象原创 2021-08-02 19:36:41 · 245 阅读 · 0 评论 -
策略模式(Strategy Pattern)
策略模式(该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户)优点1、符合开闭原则,增加策略只需要增加具体策略实现类即可2、避免 if-else 多重选择语句3、封装了具体算法,客户端不需要知道具体算法缺点1、客户端需要知道使用哪种具体策略2、策略模式会产生很多策略类,多后期学习维护增加一定难度状态模式包含以下主要角色抽象策略角色: 策略类,通常由一个接口或者抽象类实现。具体策略角色:包装了相关的算法和行为的实现类。环境角色:持有一个原创 2021-07-31 11:06:02 · 161 阅读 · 0 评论 -
状态模式(State Pattern)
状态模式(类的行为是基于它的状态改变的)当代码中包含大量与对象状态有关的条件语句时,就可以使用状态模式优点: 1、封装了转换规则。 2、枚举可能的状态,在枚举状态之前需要确定状态种类。 3、将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。 4、允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。 5、可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。缺点: 1、状态模式的使用必然会增加系统类和对象的个数。 2、原创 2021-07-29 15:12:34 · 122 阅读 · 0 评论 -
原型模式(Prototype)
2、原型模式(用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象)系统中,存在大量相同或相似对象的创建问题,如果用传统的构造函数来创建对象,会比较复杂且耗时耗资源,用原型模式生成对象就很高效优点:Java 自带的原型模式基于内存二进制流的复制,在性能上比直接 new 一个对象更加优良。可以使用深克隆方式保存对象的状态,使用原型模式将对象复制一份,并将其状态保存起来,简化了创建对象的过程,以便在需要的时候使用(例如恢复到历史某一状态),可辅助实现撤销操作。缺点:需原创 2021-07-13 15:37:07 · 209 阅读 · 0 评论 -
单例模式(Singleton)
单例模式(保证一个类只有一个实例,并提供一个可调用的全局访问点)在有些系统中,为了节省内存资源、保证数据内容的一致性,对某些类要求只能创建一个实例,这就是所谓的单例模式特点1. 单例类只有一个实例对象;2. 该单例对象必须由单例类自行创建;3. 单例类对外提供一个访问该单例的全局访问点。优点:1. 单例模式可以保证内存里只有一个实例,减少了内存的开销。2. 可以避免对资源的多重占用。3. 单例模式设置全局访问点,可以优化和共享资源的访问。缺点:1. 单例模式一般没有接口,扩展困难。如原创 2021-06-28 14:33:06 · 424 阅读 · 0 评论