java 设计模式
23 种设计模式简介
快乐的小三菊
这个作者很懒,什么都没留下…
展开
-
访问者模式
背景: 在现实生活中,有些集合对象中存在多种不同的元素,且每种元素也存在多种不同的访问者和处理方式。例如,公园中存在多个景点,也存在多个游客,不同的游客对同一个景点的评价可能不同;医院医生开的处方单中包含多种药元素,査看它的划价员和药房工作人员对它的处理方式也不同,划价员根据处方单上面的药品名和数量进行划价,药房工作人员根据处方单的内容进行抓药。 这样的例子还有很多,...原创 2019-12-23 15:09:09 · 346 阅读 · 0 评论 -
中介者模式
定义: 定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者又叫调停模式,它是迪米特法则的典型应用。适用场景: 1、当对象之间存在复杂的网状结构关系而导致依赖关系混乱且难以复用时。 2、当想创建一个运行于多个类之间的对象,又不想生成新的子类时。优点: 1、降低了对象之间的...原创 2019-12-20 22:11:22 · 285 阅读 · 0 评论 -
状态模式
定义: 对于有状态的对象,把复杂的“判断逻辑”提取到不同的对象中,允许状态对象在其内部状态发生改变时改变其行为。适用场景: 1、当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时,就可以考虑使用状态模式。 2、一个操作中含有庞大的分支结构,并且这些分支决定于对象的状态时。优点: 1、状态模式将与特定状态相...原创 2019-12-19 21:40:06 · 628 阅读 · 0 评论 -
备忘录
定义: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能够将该对象恢复到原先保存的状态。适用场景: 1、数据库事务回滚 2、ctrl+z 3、ie浏览器回退操作优点: 1、提供了一种可以恢复状态的机制。当用户需要时能够比较方便地将数据恢复到某个历史的状态。 ...原创 2019-12-18 17:27:05 · 191 阅读 · 0 评论 -
命令模式
定义: 将请求封装成对象,使发出请求的责任和执行请求的责任分隔开。这样两者之间通过命令对象进行沟通,方便将命令对象进行存储、传递、调用、增加和管理。适用场景: 1、当系统需要将请求调用者与请求接收者解耦时,命令模式使得调用者和接收者不直接交互。 2、当系统需要随机请求命令或经常增加或删除命令时,命令模式比较方便实现这些功能。 3、当...原创 2019-12-17 11:27:19 · 152 阅读 · 0 评论 -
解释器模式
定义: 解释器模式提供了一种评估计算语言语法或表达式的方法,这种模式实现了一个表达式接口,该接口解释一个特定的上下文,这种模式被用在 SQL 解析、符号处理引擎等。应用场景: 1、当语言的文法较为简单,且执行效率不是关键问题时。 2、当问题重复出现,且可以用一种简单的语言来进行表达时。 3、当一个语言需要解释执行,并且语言中的句子...原创 2019-12-16 21:43:01 · 130 阅读 · 0 评论 -
迭代器模式
背景: 在现实生活以及程序设计中,经常要访问一个聚合对象中的各个元素,如“数据结构”中的链表遍历,通常的做法是将链表的创建和遍历放在同一个类中,但这种方式不利于程序的扩展,如果要更换遍历方法就必须修改程序源代码,这违背了 “开闭原则”。 既然将遍历方法封装在聚合类中不可取,那么聚合类中不提供遍历方法,将遍历方法由用户自己实现是否可行呢?答案是同样不可取,因为这种方式...原创 2019-12-15 14:28:29 · 183 阅读 · 0 评论 -
模板方法
定义: 在一个方法中定义一个算法的骨架,而将一些步骤的实现延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义该算法的特定步骤。适用场景: 1、有多个子类共有的方法,且逻辑相同 2、重要的、复杂的方法,可以考虑作为模板方法 3、重构时,模板方法模式是一个经常使用到的模式,把相同的代码抽取到父类中,通过构造函数约束其行为优...原创 2019-12-14 21:23:35 · 128 阅读 · 0 评论 -
抽象工厂
定义: 抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定它们具体的类。使用场景: 1、客户端(应用层)不依赖于产品类实例如何被创建、实现等细节 2、强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量的重复代码 3、强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量的重复代码组成角色:...原创 2019-12-13 10:44:04 · 143 阅读 · 0 评论 -
桥接模式
1、定义 将抽象部分与它的实现部分分离,使它们都可以独立的变化。2、组成部分 1、抽象类(Abstraction) 2、扩充抽象类(RefinedAbstraction) 3、实现类接口(Implementor) 4、具体实现类(ConcreteImplementor)3、为什么使用桥接模式 桥接模式将...原创 2019-12-08 21:29:10 · 175 阅读 · 0 评论 -
适配器模式
1、定义: 将一个类的接口转换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。2、使用场景: 客户端需要一个target(目标)接口,但是不能直接重用已经存在的adaptee(适配者)类,因为它的接口和和target接口不一致,所以需要用adapter(适配器)将adaptee转换为target接口。前提是target接...原创 2019-12-03 21:50:06 · 370 阅读 · 4 评论 -
享元模式
1、定义: 享元模式主要用于减少创建对象的数量,以减少内存占用和提升性能2、优点: 大大较少对象的创建,降低系统的内存,使用率高。3、缺点: 提高了系统的复杂度,需要分离出内部状态和外部状态,而且外部状态具有固有化的性质,不应该随着内部状态的改变而变化,否则会造成系统的混乱。4、享元模式分类 1、单纯的享元模式:所有的享元...原创 2019-12-01 21:31:38 · 307 阅读 · 0 评论 -
外观模式
定义: 它是一种通过为多个复杂的子系统提供一个一致的接口,而使得这些子系统更加容易被访问的设计模式。优点: 1、降低了子系统与客户端之间的耦合性,使得子系统的变化不会影响调用它的客户类。(“迪米特法则”的典型应用) 2、对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易。 3、降低了大型软件系统中的编译...原创 2019-12-01 14:37:03 · 209 阅读 · 0 评论 -
装饰者模式
定义: 不使用继承和不改变原来类文件的情况下,动态的扩展一个对象的功能。(又名包装模式)适用场景: 1:以动态的方式给对象添加职责 2:处理那些可以撤销的职责 3:当采用生成子类的方法进行扩充时,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。装饰者模式的结构: 1、抽象组件...原创 2019-11-27 21:28:24 · 145 阅读 · 0 评论 -
组合模式
定义: 将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户以一致的方式处理单个对象以及对象的组合。关键点: 简单对象和复杂的对象必须实现相同的接口。这就是组合模式能够将简单对象和复杂对象进行一致处理的原因。数据结构: 相信大家都知道数据结构这门学科,在数据结构中有树这样的概念,树中会有根节点、叶子节点等等。树状的结构在现实生活...原创 2019-11-26 22:34:15 · 158 阅读 · 0 评论 -
策略模式
定义: 定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。组成: 1、抽象策略类(Strategy):抽象的策略,通常是一个接口或抽象类 2、具体策略类(ConcreteStrategy):具体的策略类,抽象策略类的实现 3、环境角色(Context):用来操作策略的上下文环境...原创 2017-09-29 14:44:02 · 234 阅读 · 0 评论 -
观察者模式
定义: 定义了对象之间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。适用场景: 1、对象间存在一对多关系,一个对象的状态发生改变会影响其他对象。 2、当一个抽象模型有两个方面,其中一个方面依赖于另一方面时,可将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。优点: 1、降...原创 2017-09-29 16:25:25 · 193 阅读 · 0 评论 -
工厂方法
定义: 定义一个接口来创建对象,但是让子类来决定哪些类需要被实例化,它把实例化的工作推迟到子类中实现。组成角色: 1、抽象产品(Product):描述具体产品的公共接口 2、具体产品(Concrete Product):描述生产的具体产品 3、抽象工厂(Factory):描述具体工厂的公共接口 4、具体工厂(Con...原创 2017-11-12 21:42:05 · 254 阅读 · 0 评论 -
23种设计模式分类
创建型: 处理对象的创建,实例化对象,5个(建造者、原型、单例、工厂方法、抽象工厂)结构型: 处理类或对象之间的组合,7个(组合、装饰者、外观、享元、代理、适配器、桥接)行为型: 描述类或对象怎样进行交互和职责分配,11个(策略、模板方法、责任链、迭代器、解释器、命令、备忘录、状态、中介者、观察者、访问者)设计模式六大原则,一法则:...原创 2017-09-30 15:04:37 · 294 阅读 · 0 评论 -
建造者模式
定义: 使用多个简单的对象一步一步构建成一个复杂的对象,它提供了一种创建对象的最佳方式。主要解决: 主要解决在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。使用场景: 1、需要生成的对象具有复杂的内...原创 2018-11-20 19:58:59 · 192 阅读 · 0 评论 -
原型模式
定义: 原型模式是用于创建重复的对象,同时又能保证性能,它提供了一种创建对象的最佳方式。优点: 1、性能提高 2、逃避构造函数的约束缺点: 1、配备clone()方法需要对类的功能进行全盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类的引用不支持串行化的间接对象,或者引用含有循环结构的时候。 ...原创 2018-11-20 20:26:07 · 173 阅读 · 0 评论 -
责任链模式
定义: 使多个对象都有可能处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这多个对象连成一条链,并且沿着这条链传递该请求,直到有一个对象处理它为止。优点: 将请求和处理分离出来,已进行解耦。责任链模式结构的核心在于引入了一个抽象处理类。使用场景: 1:如果有多个对象可以处理同一个请求,但是具体由哪一个对象处理是由运行时刻动态决定的,把...原创 2018-11-19 20:24:35 · 175 阅读 · 0 评论 -
代理
代理模式分为类 1、静态代理 2、动态代理 静态代理: 概述: 为目标对象提供一种代理用来控制对该对象的访问 JDK中的动态代理是通过反射类Proxy和InvocationHandler回调接口实现的。但是,JDK中所要进行动态代理的类必须要实现一个接口,也就是说只能对该类所实现接口...原创 2018-11-17 14:54:56 · 139 阅读 · 0 评论 -
单例模式
定义: 所谓单例,就是整个程序有且仅有一个实例。该类负责创建自己的对象,同时确保只有一个对象被创建。在Java中,一般用在工具类或者创建比较耗资源的对象上。实现方式:1:立即加载/饿汉模式 优缺点: 1:线程安全 2:没有调用方法前就被加载,会占用内存public class Hun...原创 2017-09-25 17:05:14 · 279 阅读 · 0 评论