
设计模式
文章平均质量分 89
我永远吹着泡泡
这个作者很懒,什么都没留下…
展开
-
设计模式总览
概述每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动解决问题的核心是:分解和抽象目标是:复用设计模式的分类类型名称介绍创建型单例模式(Singleton)保证一个类只有一个实例,并提供一个访问它的全局访问点抽象工厂(Abstract Factory)提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类工厂方法(Factory Method)定义一个用原创 2020-09-20 22:03:47 · 146 阅读 · 0 评论 -
【设计模式】Spring中涉及的设计模式总结
1.简单工厂(非23种设计模式中的一种)实现方式:BeanFactory。 Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定实质:由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类实现原理:bean容器的启动阶段:读取bean的xml配置文件,将bean元素分别转换成一个BeanDefinition对象然后通过BeanDefinitionRegistry将这些bea转载 2021-02-20 16:31:54 · 138 阅读 · 0 评论 -
【设计模式】JDK中涉及的设计模式总结
创建模式1.抽象工厂javax.xml.parsers.DocumentBuilderFactory抽象类public static DocumentBuilderFactory newInstance()方法类功能:使得应用程序可以通过 XML 文件,获得一个能生成 DOM 对象的解析器方法功能:获取一个 DocumentBuilderFactory 的新实例。这一静态方法会创建一个新的工厂实例 public abstract class DocumentBuilderFactory {转载 2021-02-20 15:52:08 · 177 阅读 · 0 评论 -
【设计模式】解释器模式(Interpreter)
概述解释器模式是我们暂时的最后一讲,一般主要应用在 OOP 开发中的编译器的开发中,所以适用面比较窄Context 类是一个上下文环境类,Plus 和 Minus 分别是用来计算的实现给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子适用性当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。而当存在以下情况时该模式效果最好:该文法简单对于复杂的文法,文法的类层次变得庞大而无法管理效率不是一个关键问题最高效的解原创 2020-09-20 20:55:02 · 101 阅读 · 0 评论 -
【设计模式】中介者模式(Mediator)
概述用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互中介者模式也是用来降低类类之间的耦合的,因为如果类类之间有依赖关系的话,不利于功能的拓展和维护,因为只要修改一个对象,其它关联的对象都得进行修改如果使用中介者模式,只需关心和 Mediator 类的关系,具体类类之间的关系及调度交给 Mediator 就行,这有点像 spring 容器的作用适用性一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以原创 2020-09-20 20:50:12 · 106 阅读 · 0 评论 -
【设计模式】访问者模式(Visitor)
概述表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作如果我们想为一个现有的类增加新功能,不得不考虑几个事情:新功能会不会与现有功能出现兼容性问题?以后会不会再需要添加?如果类不允许修改代码怎么办?面对这些问题,最好的解决方法就是使用访问者模式,访问者模式适用于数据结构相对稳定的系统,把数据结构和算法解耦适用性一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作需要对一个对象结构中的对象进行很原创 2020-09-17 23:35:59 · 126 阅读 · 0 评论 -
【设计模式】状态模式(State)
概述定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新就拿 QQ 来说,有几种状态,在线、隐身、忙碌等,每个状态对应不同的操作,而且你的好友也能看到你的状态适用性一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态案例 public interface Weather { String getWeather(); }原创 2020-09-17 23:35:21 · 139 阅读 · 0 评论 -
【设计模式】备忘录模式(Memento)
概述在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态适用性必须保存一个对象在某一个时刻的(部分)状态,这样以后需要时它才能恢复到先前的状态如果一个用接口来让其它对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性案例 public class Memento { private String state; public Memento(String state) {原创 2020-09-17 00:13:27 · 101 阅读 · 0 评论 -
【设计模式】命令模式(Command)
概述将请求封装成对象,以便使用不同的请求、日志、队列等来参数化其他对象。命令模式也支持撤销操作命令模式的目的就是达到命令的发出者和执行者之间解耦,实现请求和执行分开举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互解耦,任何一方都不用去依赖其他人,只需要做好自己的事儿就行,司令员要的是结果,不会去关注到底士兵是怎么实现的适用性抽象出待执行的动作以参数化某对象在不同的时刻指定、排列和执行请求原创 2020-09-17 00:05:40 · 82 阅读 · 0 评论 -
【设计模式】责任链模式(Chain of Responsibility/COR)
概述有多个对象,每个对象持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递,直到某一对象决定处理该请求。但是发出者并不清楚到底最终那个对象会处理该请求,所以,责任链模式可以实现,在隐瞒客户端的情况下,对系统进行动态的调整同时使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止这一模式的想法是,给多个对象处理一个请求的机会,从而解耦发送者和接受者适用性有多个的对象可以处理一个请求,哪个对象处理该请原创 2020-09-14 23:01:32 · 139 阅读 · 0 评论 -
【设计模式】迭代器模式(Iterator)
概述迭代器模式就是顺序访问聚集中的对象,一般来说,集合中非常常见,如果对集合类比较熟悉的话,理解本模式会十分轻松。这句话包含两层意思:一是需要遍历的对象,即聚集对象,二是迭代器对象,用于对聚集对象进行遍历访问适用性访问一个聚合对象的内容而无需暴露它的内部表示。支持对聚合对象的多种遍历。为遍历不同的聚合结构提供一个统一的接口(即,支持多态迭代)。案例 public interface Iterator { Object next(); void fir原创 2020-09-14 22:50:59 · 115 阅读 · 0 评论 -
【设计模式】观察者模式(Observer)
概述当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种一对多的关系。类似于邮件订阅和 RSS 订阅,当我们浏览一些博客或 wiki 时,经常会看到 RSS 图标,就这的意思是,当你订阅了该文章,如果后续有更新,会及时通知你适用性当一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变当一个对象必须通知其它对象,而它又不能假定其它对象是谁案原创 2020-09-13 21:04:20 · 128 阅读 · 0 评论 -
【设计模式】模板方法模式(Template Method)
概述模板方法即定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤适用性一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码控制子类扩展案例 public abstract class Templat原创 2020-09-13 20:53:40 · 120 阅读 · 0 评论 -
【设计模式】策略模式(strategy)
概述策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户适用性许多相关的类仅仅是行为有异。"策略"提供了一种用多个行为中的一个行为来配置一个类的方法需要使用一个算法的不同变体算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句案例 public abstra原创 2020-09-13 20:45:39 · 144 阅读 · 0 评论 -
【设计模式】享元模式(Flyweight)
概述运用共享技术有效地支持大量细粒度的对象享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用FlyWeightFactory 负责创建和管理享元单元,当一个客户端请求时,工厂需要检查当前对象池中是否有符合条件的对象,如果有,就返回已经存在的对象,如果没有,则创建一个新对象,FlyWeight是超类。一提到共享池,我们很容易联想到 Java 里面的 JDBC 连接池,想想每个连接的特点,我们不难总结出:适用于作共享的一些个对象,他们有一些共有的属原创 2020-09-13 20:40:36 · 86 阅读 · 0 评论 -
【设计模式】组合模式(Composite)
概述将对象组合成树形结构以表示"部分-整体"的层次结构。Composite 使得用户对单个对象和组合对象的使用具有一致性适用性你希望表示对象的部分-整体层次结构你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象案例 public abstract class Employer { private String name; public void setName(String name) { this.na原创 2020-09-13 20:11:55 · 91 阅读 · 0 评论 -
【设计模式】桥接模式(Bridge)
桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化。桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化,像我们常用的 JDBC 桥 DriverManager 一样,JDBC 进行连接数据库的时候,在各个数据库之间进行切换,基本不需要动太多的代码,甚至丝毫不用动,原因就是 JDBC 提供统一接口,每个数据库提供各自的实现,用一个叫做数据库驱动的程序来桥接就行了 public abstract class Clothing { public abstract void原创 2020-09-03 23:12:41 · 104 阅读 · 0 评论 -
【设计模式】外观模式(Facade)
外观模式是为了解决类与类之间的依赖关系的,像 spring 一样,可以将类和类之间的关系配置到配置文件中,而外观模式就是将他们的关系放在一个 Facade 类中,降低了类类之间的耦合度,该模式中没有涉及到接口适用性:当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。Facade 可以提供一个简单的缺省视图,这一视图对大多数用户原创 2020-09-03 22:59:50 · 319 阅读 · 0 评论 -
【设计模式】代理模式(Proxy)
代理模式就是多一个代理类出来,替原对象进行一些操作。例如已有的方法在使用的时候,需要对原有的方法进行改进,此时有两种办法:(1)修改原有的方法来适应。这样违反了"对扩展开放,对修改关闭"的原则;(2)就是采用一个代理类调用原有的方法,且对产生的结果进行控制 public interface Sourceable { public void method(); } public class Source implements Sourceable {原创 2020-09-03 00:02:52 · 118 阅读 · 0 评论 -
【设计模式】装饰模式(Decorator)
装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实,Decorator 模式相比生成子类更为灵活适用性在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责处理那些可以撤消的职责当不能采用生成子类的方法进行扩充时 public interface Sourceable { public void method(); } public class Source implement原创 2020-09-02 23:21:22 · 130 阅读 · 0 评论 -
【设计模式】适配器模式(Adapter)
适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题感兴趣的可以看看 SPI 机制,就是适配器模式实现的适配器的分类类的适配器模式对象的适配器模式接口的适配器模式类的适配器模式核心思想就是:有一个 Source 类,拥有一个方法,待适配,目标接口是 Targetable,通过 Adapter 类,将 Source 的功能扩展到 Targetable 里 public class Source { public vo原创 2020-09-02 23:10:26 · 152 阅读 · 0 评论 -
【设计模式】原型模式(Prototype)
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象适用性:(1)当一个系统应该独立于它的产品创建、构成和表示时;(2)当要实例化的类是在运行时刻指定时,例如,通过动态装载;(3)为了避免创建一个与产品类层次平行的工厂类层次时;(4)当一个类的实例只能有几个不同状态组合中的一种时原型模式虽然是创建型的模式,但是与工程模式没有关系,从名字即可看出,该模式的思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象方法一 // 原型 public class Prot原创 2020-09-01 23:27:08 · 176 阅读 · 0 评论 -
【设计模式】建造者模式(builder)
建造者模式即将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示建造者模式适用于:(1)当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时;(2)当构造过程必须允许被构造的对象有不同的表示时 // 建造过程 public interface PersonBuilder { void buildHead(); void buildBody(); void buildFoot(); Person bu原创 2020-09-01 22:26:32 · 167 阅读 · 0 评论 -
【设计模式】抽象工厂设计模式(AbstractFactory)
设计模式之抽象工厂设计模式抽象工厂即提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类工厂方法模式和抽象工厂模式的区别工厂方法模式一个抽象产品类,可以派生出多个具体产品类一个抽象工厂类,可以派生出多个具体工厂类每个具体工厂类只能创建一个具体产品类的实例抽象工厂模式多个抽象产品类,每个抽象产品类可以派生出多个具体产品类一个抽象工厂类,可以派生出多个具体工厂类每个具体工厂类可以创建多个具体产品类的实例,也就是创建的是一个产品线下的多个产品具体区别:工厂方原创 2020-07-30 22:41:46 · 148 阅读 · 0 评论 -
【设计模式】工厂设计模式(FactoryMethod)
设计模式之工厂设计模式工厂设计模式即创建一个工厂来创建和提供大量具有相似功能的类,这样的设计模式有几个好处:类的创建和使用分离。工厂类创建类,调用者来调用需要的类降低了代码的重复。工厂类可以批量创建大量功能的类简单工厂注意:简单工厂不属于设计模式普通简单工厂 // 创建二者的共同接口: public interface Sender { public void Send(); } // 创建实现类: public class Mail原创 2020-07-30 22:16:38 · 146 阅读 · 0 评论 -
【设计模式】单例设计模式(Singleton)
设计模式之单例设计模式单例对象 (Singleton) 是一种常用的设计模式在 Java 应用中,单例对象能保证在一个 JVM 中,该对象只有一个实例存在。这样的模式有几个好处:某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销省去了 new 操作符,降低了系统内存的使用频率,减轻 GC 压力有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。(比如一个军队出现了多个司令员同时指挥,肯定会乱成一团),所以只有使用单例模式,才能保证核心交易服务器独立控制原创 2020-05-24 22:51:52 · 187 阅读 · 0 评论