设计模式
文章平均质量分 51
程序员黄小青
技术之路任重道远,上下求索不亦乐乎
展开
-
java设计模式-25职责链模式
定义责任链模式,为请求创建了一个接收者对象职责链模式通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推的链(简单示意图)。将请求和处理分开,实现解耦,提高系统的灵活性性能会受到影响,特别是在链比较长的时候,因此需控制链中最大节点数量调试不方便。采用了类似递归的方式,调试时逻辑可能比较复杂角色Handler : 抽象的处理者, 定义了一个处理请求的接口, 同时含义另外HandlerConcreteHandlerA , B原创 2021-02-28 14:41:02 · 101 阅读 · 1 评论 -
java设计模式-24策略模式
定义:定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户这算法体现了几个设计原则第一、把变化的代码从不变的代码中分离出来;第二、针对接口编程而不是具体类(定义了策略接口);第三、多用组合/聚合,少用继承(客户通过组合方式使用策略)。多用组合/聚合 少用继承;用行为类组合,而不是行为的继承。更有弹性体现了“对修改关闭,对扩展开放”原则,客户端增加行为不用修改原有代码,只要添加一种策略(或者行为)即可,避免了使用多重转移语句(if…else if…e原创 2021-02-28 13:07:11 · 95 阅读 · 1 评论 -
java设计模式-23状态模式
定义:它主要用来解决对象在多种状态转换时,需要对外输出不同的行为的问题。状态和行为是一一对应的,状态之间可以相互转换当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类代码有很强的可读性。状态模式将每个状态的行为封装到对应的一个类中符合“开闭原则”。容易增删状态缺点:会产生很多类。每个状态都要一个对应的类,当状态过多时会产生很多类,加大维护难度角色Context 类为环境角色, 用于维护State实例,这个实例定义当前状态State 是抽象状态角色,定义一个接口封装原创 2021-02-28 12:46:54 · 64 阅读 · 0 评论 -
java设计模式-22解释器模式
定义:是指给定一个语言(表达式),定义它的文法的一种表示,并定义一个解释器,使用该解释器来解释语言中的句子(表达式)在编译原理中,一个算术表达式通过词法分析器形成词法单元,而后这些词法单元再通过语法分析器构建语法分析树,最终形成一颗抽象的语法分析树。这里的词法分析器和语法分析器都可以看做是解释器当有一个语言需要解释执行,可将该语言中的句子表示为一个抽象语法树,就可以考虑使用解释器模式,让程序具有良好的扩展性优点扩展性好。由于在解释器模式中使用类来表示语言的文法规则,因此可以通过继承等机原创 2021-02-28 12:14:03 · 71 阅读 · 0 评论 -
java设计模式-21备忘录模式
定义在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态它提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原。实现了信息的封装,不需要关心状态的保存细节。缺点:消耗资源,如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。备忘录模式的角色originator : 对象(需要保存状态的对象)Memento :原创 2021-02-28 10:16:09 · 73 阅读 · 1 评论 -
java设计模式-21中介者模式
定义定义一个中介对象来简化原有对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解。外观是提供一个共同接口,这个是直接调用其他系统,不用实现统一接口多个类相互耦合,会形成网状结构, 使用中介者模式将网状结构分离为星型结构,进行解耦,符合迪米特原则中介者承担了较多的责任,一旦中介者出现了问题,整个系统就会受到影响如果设计不当,中介者对象本身变得过于复杂,这点在实际使用时,要特别注意比如MVC模式,C(Controller控制器)是M(Model模型)和V(View视图)的中介原创 2021-02-28 09:53:19 · 119 阅读 · 1 评论 -
java设计模式-20观察者模式
定义对象之间多对一依赖的一种设计方案,依赖它的对象为被通知并更新信息其实就是发布订阅功能,订阅了就有消息了这个模式是松偶合的。改变主题或观察者中的一方,另一方不会受到影像。该模式包含四个角色抽象被观察者角色:也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。具体被观察者角色:也就是一个具体的原创 2021-02-28 08:58:07 · 75 阅读 · 0 评论 -
java设计模式-19迭代器模式
定义如果我们的集合元素是用不同的方式实现的,有数组,还有java的集合类,或者还有其他方式,当客户端要遍历这些集合元素的时候就要使用多种遍历方式,而且还会暴露元素的内部结构,可以考虑使用迭代器模式解决。迭代器模式,提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示,即:不暴露其内部的结构。)提供了一种设计思想,就是一个类应该只有一个引起变化的原因(叫做单一责任原则)。在聚合类中,我们把迭代器分开,就是要把管理对象集合和遍历对象集合的责任分开,这样一来集合改变的原创 2021-02-28 08:24:27 · 70 阅读 · 1 评论 -
java设计模式-18访问者模式
定义封装一些作用于某种数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。在被访问的类里面加一个对外提供接待访问者的接口需要对一个对象结构中的对象进行很多不同操作(这些操作彼此没有关联),同时需要避免让这些操作"污染"这些对象的类,可以选用访问者模式解决访问者模式主要由这五个角色组成,抽象访问者(Visitor)角色:声明了一个或者多个方法操作,形成所有的具体访问者角色必须实现的接口。具体访问者(ConcreteVisitor)角色:实现抽象访问者所声明的接原创 2021-02-27 21:24:19 · 103 阅读 · 0 评论 -
java设计模式-17命令模式
定义:命名模式使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活,实现解耦。命令模式把请求封装起来,可以动态地对它进行参数化、队列化和日志化等操作,从而使得系统更灵活。命令模式中的命令对象能够很容易地组合成复合命令,也就是宏命令,从而使系统操作更简单,功能更强大。由于发起命令的对象和具体的实现完全解耦,因此扩展新的命令就很容易,只需要实现新的命令对象,然后在装配的时候,把具体的实现对象设置到命令对象中,然后就可以使用这个命令对象,已有的实现完全不用变化。代码盒式录音原创 2021-02-27 19:47:31 · 109 阅读 · 0 评论 -
java设计模式-16模板模式
定义在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤基本思想是:算法只存在于一个地方,也就是在父类中,容易修改。需要修改算法时,只要修改父类的模板方法或者已经实现的某些步骤,子类就会继承这些修改**实现了最大化代码复用。**父类的模板方法和已实现的某些步骤会被子类继承而直接使用一般模板方法都加上final原创 2021-02-27 18:08:22 · 97 阅读 · 0 评论 -
java设计模式-15代理模式
定义代理模式:为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象代理模式有不同的形式, 主要有三种 **静态代理、动态代理 **(JDK代理、接口代理)和 Cglib代理 (可以在内存动态的创建对象,而不需要实现接口, 他是属于动态代理的范畴)静态代理优点:在不修改目标对象的功能前提下,能通过代理对象对目标功能原创 2021-02-27 17:51:00 · 58 阅读 · 0 评论 -
java设计模式-14享元模式
定义:也叫 蝇量模式: 运用共享技术有效地支持大量细粒度的对象享元即为分享元素,字符串常量池、数据库连接池、缓冲池都是是这个道理能够解决重复对象的内存浪费的问题,当系统中有大量相似对象,需要缓冲池时。不需总是创建新对象,可以从缓冲池里拿。这样可以降低系统内存,同时提高效率必须有个工厂类来控制缺点:提高了系统的复杂度,需要分离出外部和内部状态,并且外部状态具有固有话性质,不应该随着内部状态变化而变化,否则会造成系统混乱内部和外部状态享元模式提出了两个要求:细粒度和共享对象。这里就涉及到内部原创 2021-02-27 16:39:56 · 69 阅读 · 0 评论 -
java设计模式-13外观模式
定义也叫“过程模式:外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用外观模式通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节不能过多的或者不合理的使用外观模式,使用外观模式好,还是直接调用模块好。要以让系统有层次,利于维护为目的。角色>门面角色(facade):这是外观模式的核心。它被客户角色调用,因此它熟悉子系统的功能。它内部根据客户角色已有的需求预定了几原创 2021-02-27 15:17:23 · 155 阅读 · 0 评论 -
java设计模式-12组合模式
定义:组合多个对象形成树形结构以表示有整体-部分关系层次结构,组合模式可以让客户端统一对待单个对象和组合对象(类似递归)简化客户端操作。客户端只需要面对一致的对象而不用考虑整体部分或者节点叶子的问题。具有较强的扩展性。当我们要更改组合对象时,我们只需要调整内部的层次关系,客户端不用做出任何改动.方便创建出复杂的层次结构。客户端不用理会组合里面的组成细节,容易添加节点或者叶子从而创建出复杂的树形结构需要遍历组织机构,或者处理的对象具有树形结构时, 非常适合使用组合模式要求较高的抽象性,如果原创 2021-02-27 14:57:56 · 72 阅读 · 0 评论 -
java设计模式-11装饰者模式
定义完全遵守开闭原则,动态给对象增加一些职责(扩展功能),既增加其额外的功能,就是动态的把新功能加到对象上;就跟糖一样,买的时候有糖纸,其实本质还是糖,主要是增加功能继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的增加一些职责与代理的区别: 将原始对象作为一个参数传给装饰着,主要是增加功能,在运行时递归才能被构造缺点,增加许多子类,过分使用会增加程序复杂性装饰者模式就像打包一个快递 主体:比如:陶瓷、衣服 (Component) // 被装饰者 包装:比如:报纸填充、原创 2021-02-27 14:11:53 · 70 阅读 · 0 评论 -
java设计模式-10桥接模式
定义基于类的最小设计原则,将抽象部分与它的实现部分分离,使它们都可以独立的变化。继承关系多了,不易于维护父类,而笔者认为桥接模式的出现很好的解决了这个问题。用聚合解决继承的父类难维护性桥梁模式是对象的结构模式。又称为柄体(Handle and Body)模式或接口(Interface)模式。桥梁模式的用意是“将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化”。基于类的最小设计选择,通过封装,聚合以及继承等行为让不同的类,承担不同职责应用场景原创 2021-02-27 13:09:26 · 72 阅读 · 0 评论 -
java设计模式-09适配器模式
定义:将某个类的接口转成客户端期望的另外一个接口表示,主要目的是兼容性使用起来有点像多重集成机制, 利用接口的特性, 把一些零散类组织到一起, 成为一个新的类来实现调用, 并且看起来像是对一个类的操作. 实际上, 适配器模式更过的是强调对代码的组织, 而不是功能的实现角色:Target: 目标接口类, 客户所期待的接口, 目标可以是具体的或者抽象的类, 也可以是接口Adaptee: 需要适配的类Adapter: 通过包装一个需要的支配器对象, 把原来的接口转换成目标接口优点:系统需原创 2021-02-27 11:50:01 · 94 阅读 · 0 评论 -
java设计模式-08建造者模式
定义为了分离对象的属性与创建过程又被称呼为生成器模式,这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。使用多个简单的对象一步一步构建成一个复杂的对象,有点像造房子一样一步步从地基做起到万丈高楼。主要作用:在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。如何使用:用户只需要给出指定复杂对象的类型和内容,建造者模式负责按顺序创建复杂对象(把内部的建造过程和细节隐藏起来)注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序,一般用来创建更为复杂的对象原创 2021-02-26 23:37:38 · 97 阅读 · 0 评论 -
java设计模式-07-原型工厂模式(克隆)
定义通过将一个原型对象传给要发动创建的对象,这个要发动的创建的对象通过请求原型对象了拷贝他们自己实现创建,即 对象.clone()用原型实例指定创建对象的种类,并且通过拷贝,创建新的对象缺点:需要为每一类配置一个克隆方法,对已有类改造,需修改源代码,违背了ocp原则浅拷贝定义:而浅拷贝只是传递地址指向,新的对象并没有对引用数据类型创建内存空间。对于数据类型是基本数据类型的成员变量,浅拷贝会直接进行值传递,也就是将该属性值复制一份给新的对象。对于数据类型是引用数据类型的成员变量,比如说成员原创 2021-02-26 21:40:32 · 285 阅读 · 0 评论 -
java设计模式-06-抽象工厂模式
定义:抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的。抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。模式中包含的角色及其职责抽象工厂(Creator)角色:抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。(FruitFactory)具体工厂( Concrete Creator)角色:具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象。(InnerFruitFactory,No原创 2021-02-26 20:41:44 · 85 阅读 · 1 评论 -
java设计模式-05-工厂模式
定义工厂方法模式同样属于类的创建型模式又被称为多态工厂模式 。工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。定义一个创建对象的抽象方法,由子类决定要实例化的类(对象实例化由子类实现)这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。名词解释抽象工厂(Creator)角色:工厂方法模式的核心,任何工厂类都必须实现这个接口(FruitFactory)具体工厂( Concrete Creator)角色:具体工厂类是抽原创 2021-02-26 20:19:03 · 151 阅读 · 2 评论 -
java设计模式-04-简单工厂
定义:也叫静态工厂模式;一个工厂对象决定创建出哪一种产品的实例(传入一个type,实例并执行type对应逻辑)最简单也是最实用的模式通过专门定义一个类来负责创建其它类的实例,被创建的实例通常 都具有共同的父类。工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化由于工厂类集中了所有实例的创建逻辑,所以“高内聚”方面做的并不好原创 2021-02-25 22:33:20 · 53 阅读 · 0 评论 -
java设计模式-03单例模式-本文介绍7种方法
单例模式特点单例类只能有一个实例。单例类必须自己创建自己的唯一实例。单例类必须给所有其他对象提供这一实例。饿汉式(静态常量)构造器私有化类内部创建向外部暴露一个静态的公共方法优点;简单,避免了线程同步问题缺点,如果没使用,就造成了内存浪费;2没有达到满加载效果代码实现:饿汉式(静态代码块)只是实现方式不同,优缺点和上述一致代码实现:懒汉式(线程不安全)优点:懒加载缺点:只能在单线程下,多线程会造成多个实例,实际开发中,不能使原创 2021-02-25 21:32:22 · 68 阅读 · 0 评论 -
设计模式-02七大原则
设计模式目的:代码重用性 (即:相同功能的代码,不用多次编写)可读性 (即:编程规范性, 便于其他程序员的阅读和理解)可扩展性 (即:当需要增加新的功能时,非常的方便,称为可维护)可靠性 (即:当我们增加新的功能后,对原来的功能没有影响)使程序呈现高内聚,低耦合的特性七大原则有:单一职责原则一个类只负责一项职责,但是不是只有一个方法提高可读性,可维护性由于是一个类做一个事,不会相交,修改一处,不会影响其他功能接口隔离原则客户端不应该依赖他不需要的接口,说白了就是类原创 2021-02-25 21:22:08 · 99 阅读 · 0 评论 -
java设计模式--01类图UML图箭头含义
泛化:表示一个更泛化的元素和一个更具体的元素的关系表现方式主要是继承表示方式:用实线空心箭头表示实现类和接口之间的关系表示方式:用虚线空心三角形箭头表示,实现类指向接口。依赖是一种使用的关系,即一个类的实现需要另一个类的协助。方法参数需要传入另一个类的对象,就表示依赖这个类。表示方式:虚线箭头。聚合整体个部分的关系,整体和部分可以分开例如:电脑和鼠标表示方式:尾部为空心菱形的实线箭头(也可以没箭头)。组合整体个部分的关系,整体和部分不可以分开.人和头的原创 2021-02-25 21:02:23 · 4173 阅读 · 2 评论