设计模式
javafg
一枚java程序猿,分享一些java项目实战经验与日常开发记录等过程,期待您的关注
展开
-
设计模式系列(行为型模式)之十一 状态模式
状态(State)模式的定义:对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。状态模式是一种对象行为型模式,其主要优点如下。状态模式将与特定状态相关的行为局部化到一个状态中,并且将不同状态的行为分割开来,满足“单一职责原则”。减少对象间的相互依赖。将不同的状态引入独立的对象中会使得状态转换变得更加明确,且减少对象间的相互依赖。有利于程序的扩展。通过定义新的子类很容易地增加新的状态和转换。状态模式的主要缺点如下。状态模式的使用必然会增加系统原创 2020-09-21 09:00:31 · 134 阅读 · 0 评论 -
设计模式系列(行为型模式)之十 访问者模式
访问者(Visitor)模式的定义:将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。它将对数据的操作与数据结构进行分离,是行为类模式中最复杂的一种模式。访问者(Visitor)模式是一种对象行为型模式,其主要优点如下。扩展性好。能够在不修改对象结构中的元素的情况下,为对象结构中的元素添加新的功能。复用性好。可以通过访问者来定义整个对象结构通用的功能,从而提高系统的复用程度。灵活性好。访问原创 2020-09-21 08:59:34 · 82 阅读 · 0 评论 -
设计模式系列(行为型模式)之九 职责链模式模式
职责链模式职责链模式为请求创建一个接收此次请求对象的链。为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止适用于:一个请求的处理需要多个对象当中的一个或几个协作处理;优点:请求的发送者和接受者(请求的处理)解耦;职责链可以动态的组合。缺点:职责链太长或者处理时间过长,影响性能;职责链可能过多。应用场景有多个对象可以处理一个请求,哪个对象处理该请求由运行时刻自动确定原创 2020-09-18 09:05:22 · 96 阅读 · 0 评论 -
设计模式系列(行为型模式)之八 中介者模式
中介者(Mediator)模式的定义:定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。中介者模式是一种对象行为型模式,其主要优点如下。降低了对象之间的耦合性,使得对象易于独立地被复用。将对象间的一对多关联转变为一对一的关联,提高系统的灵活性,使得系统易于维护和扩展。其主要缺点是:当同事类太多时,中介者的职责将很大,它会变得复杂而庞大,以至于系统难以维护。中介者模式主要场景当对象之间存在复杂的网原创 2020-09-18 09:03:58 · 127 阅读 · 0 评论 -
设计模式系列(行为型模式)之七 命令模式
命令(Command)模式的定义如下:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。命令模式的主要优点如下。降低系统的耦合度。命令模式能将调用操作的对象与实现该操作的对象解耦。增加或删除命令非常方便。采用命令模式增加与删除命令不会影响其他类,它满足“开闭原则”,对扩展比较灵活。可以实现宏命令。命令模式可以与组合模式结合,将多个命令装配成一个组合命令,即宏命令。方便实现 Undo 和 Redo原创 2020-09-16 15:28:00 · 168 阅读 · 0 评论 -
设计模式系列(行为型模式)之五 观察者模式
观察者模式观察者模式定义了对象之间的一对多依赖,让多个观察者同时监听某个主题对象,当主体对象发生变化时,它的所有观察者都会收到响应的通知。优点:观察者和被观察者之间建立一个抽象的耦合;目标与观察者之间建立了一套触发机制观察者模式支持广播通信。缺点:当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率观察者之间有过多的细节依赖,提高时间消耗及程序复杂度;应避免循环调用。观察者模式适合以下几种情形。1.对象间存在一对多关系,一个对象的状态发生改变会影响其他对象。2.当一个抽象模型原创 2020-09-15 11:20:57 · 181 阅读 · 0 评论 -
设计模式系列(行为型模式)之四 解释器模式
解释器模式解释器(Interpreter)模式的定义:给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解析器来解释语言中的句子。也就是说,用编译语言的方式来分析应用中的实例。这种模式实现了文法表达式处理的接口,该接口解释一个特定的上下文。这里提到的文法和句子的概念同编译原理中的描述相同,“文法”指语言的语法规则,而“句子”是语言集中的元素。例如,汉语中的句子有很多,“我是中国人”是其中的一个句子,可以用一棵语法树来直观地描述语言中的句子。优点扩展性好。由于在解释器模式中使用类来表示语言的文原创 2020-09-15 11:19:50 · 93 阅读 · 0 评论 -
设计模式系列(行为型模式)之三 策略模式
策略模式策略模式定义了算法家族,分别封装起来,让它们之间可以互相替换。此模式让算法的变化不会影响到使用算法的用户。策略模式常用于消除大量的if else代码。策略模式的主要优点如下。多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句。策略模式提供了一系列的可供重用的算法族,恰当使用继承可以把算法族的公共代码转移到父类里面,从而避免重复的代码。策略模式可以提供相同行为的不同实现,客户可以根据不同时间或空间要求选择不同的。策略模式提供了对开闭原则的完美支持,可以在不修改原代码的情况下,灵活原创 2020-09-14 13:35:01 · 130 阅读 · 0 评论 -
设计模式系列(行为型模式)之二 迭代器模式
迭代器(Iterator)模式的定义:提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。迭代器模式是一种对象行为型模式,优点访问一个聚合对象的内容而无须暴露它的内部表示。遍历任务交由迭代器完成,这简化了聚合类。它支持以不同方式遍历一个聚合,甚至可以自定义迭代器的子类以支持新的遍历。增加新的聚合类和迭代器类都很方便,无须修改原有代码。封装性良好,为遍历不同的聚合结构提供一个统一的接口。缺点增加了类的个数,这在一定程度上增加了系统的复杂性。迭代器模式是通过将聚合对象的遍原创 2020-09-14 13:33:08 · 146 阅读 · 0 评论 -
设计模式系列(行为型模式)之一 模板方法模式
模板方法模式模板方法模式定义了一个流程的骨架,由多个方法组成。并允许子类为一个或多个步骤提供实现。简而言之就是公共的不变的部分由父类统一实现,变化的部分由子类来个性化实现。优点:提高复用性;提高拓展性;符合开闭原则。缺点:类的数目增加;增加了系统实现的复杂度;父类添加新的抽象方法,所有子类都要改一遍。模板方法模式包含以下主要角色。(1) 抽象类(Abstract Class):负责给出一个算法的轮廓和骨架。它由一个模板方法和若干个基本方法构成。这些方法的定义如下。模板方法:定义了算原创 2020-09-11 08:59:51 · 226 阅读 · 1 评论 -
设计模式系列(结构型模式)之七 代理模式
代理模式为其他对象提供一种代理,以控制对这个对象的访问,代理对象在客户端和目标对象之间起到了中介的作用。适用于:保护目标对象;增强目标对象。优点:将代理对象和真实被调用的目标对象分离;降低耦合,拓展性好;保护目标对象,增强目标对象。缺点:造成类的数目增加,增加复杂度;客户端和目标对象增加代理对象,会造成处理速度变慢。代理模式的主要角色如下。抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法。真实主题(Real Subject)类:实现了抽象主题中的原创 2020-09-10 09:16:43 · 128 阅读 · 0 评论 -
设计模式系列(结构型模式)之六 桥接模式
桥接模式将抽象部分和具体实现部分分离,使它们都可以独立变化。通过组合的方式建立两个类之间的关系,而不是通过继承。适用于:抽象和实体实现之间增加更多的灵活性;一个类存在多个独立变化的维度,并且需要独立拓展;不希望使用继承。优点:分离抽象部分和具体实现部分;提高了系统可拓展性;符合开闭原则和合成复用原则。缺点:增加了系统的理解和设计难度;桥接(Bridge)模式包含以下主要角色。抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。扩展抽象化(Refined原创 2020-09-10 09:11:00 · 112 阅读 · 0 评论 -
设计模式系列(结构型模式)之五 享元模式
享元模式提供了减少对象数量从而改善应用所需的对象结构的方式,运用共享技术有效地支持大量细粒度的对象。适用于:底层系统开发,解决性能问题;系统拥有大量相似对象,需要缓冲池的场景。优点:相同对象只要保存一份,这降低了系统中对象的数量,从而降低内存占用缺点:关注内/外部状态,关注线程安全问题;程序的逻辑复杂化。享元模式中存在以下两种状态:内部状态,即不会随着环境的改变而改变的可共享部分,可以简单理解为享元对象的属性状态外部状态,指随环境改变而改变的不可以共享的部分。享元模式的实现要领就是区原创 2020-09-08 09:31:21 · 132 阅读 · 0 评论 -
设计模式系列(结构型模式)之四 组合模式
组合模式将对象组合成树形结构以表示“部分-整体”的层次结构,使客户端对单个对象和组合对象保持一致的方式处理。适用于:客户端可以忽略组合对象与单个对象的差异;处理树形结构数据。优点:层次清晰;客户端不必关系层次差异,方便控制;符合开闭原则。缺点:树形处理较为复杂。组合模式包含以下主要角色。抽象构件(Component)角色:它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为。在透明式的组合模式中抽象构件还声明访问和管理子类的接口;在安全式的组合模式中不声明访问和管理子原创 2020-09-08 09:29:41 · 104 阅读 · 0 评论 -
设计模式系列(结构型模式)之三 适配器模式
适配器模式将一个类的接口转换为期望的另一个接口,使原本不兼容的类可以一起工作。适用于:已存在的类,它的方法和需求不匹配时(方法结果相同或者相似)优点:提高类的透明性和复用,现有的类复用但不需改变;目标类和适配器类解耦,提高程序拓展性;符合开闭原则。缺点:适配器编写过程需要全面考虑,可能会增加系统的复杂性;降低代码可读性。适配器模式(Adapter)包含以下主要角色。目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。适配者(Adaptee)类:它是被访问和适配原创 2020-09-04 08:56:16 · 275 阅读 · 0 评论 -
设计模式系列(结构型模式)之二 装饰模式
装饰者模式在不改变原有对象的基础之上,动态地将额外的功能附加到该对象上,提供了比继承更有弹性的替代方案。适用于:拓展一个类的功能;动态给对象添加功能,并且动态撤销。优点:继承的有力补充,不改变原有对象的情况下给对象拓展功能;通过使用不同的装饰类、不同的组合方式,实现不同的效果。符合开闭原则。缺点:装饰模式增加了许多子类,如果过度使用会使程序变得很复杂,增加程序复杂性;装饰模式主要包含以下角色。抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。具体构件原创 2020-09-03 14:37:17 · 115 阅读 · 0 评论 -
设计模式系列(结构型模式)之一 外观模式
结构型模式外观模式外观模式又叫门面模式,提供了统一得接口,用来访问子系统中的一群接口。是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。适用于:子系统越来越复杂,增加外观模式提供简单接口调用;构建多层系统结构,利用外观对象作为每层的入口,简化层间调用。优点:简化了调用过程,无需了解深入子系统;减低耦合度;更好的层次划分;符合迪米特原创 2020-09-03 14:30:31 · 180 阅读 · 0 评论 -
设计模式系列(创建型模式)之五 原型模式
用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,无须知道对象创建的细节原创 2020-09-02 09:06:03 · 119 阅读 · 0 评论 -
设计模式系列(创建型模式)之四 建造者模式
建造者模式也称为生成器模式(Builder Pattern),将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。简单来说就是,相同的过程可以创建不同的产品原创 2020-09-02 08:58:09 · 178 阅读 · 0 评论 -
设计模式系列(创建型模式)之三单例模式
单例模式指一个类只有一个实例,且该类能自行创建这个实例的一种模式。单例模式有 3 个特点:单例类只有一个实例对象;该单例对象必须由单例类自行创建;单例类对外提供一个访问该单例的全局访问点;原创 2020-09-01 09:14:38 · 213 阅读 · 0 评论 -
设计模式系列(创建型模式)之二 抽象工厂模式
抽象工厂模式的主要角色如下:抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 ,可以创建多个不同等级的产品。具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它 同具体工厂之间是多对一的关系。原创 2020-08-31 09:46:39 · 146 阅读 · 0 评论 -
设计模式系列(创建型模式)之一 工厂模式
工厂方法模式的主要角色如下。--抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 来创建产品。--具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。--抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。--具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。原创 2020-08-28 16:26:07 · 191 阅读 · 0 评论