![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
架构篇
文章平均质量分 90
与程序架构相关的知识
原来是肖某人
杭州电子科技大学计算机硕士
展开
-
Java的单分派与双分派以及访问者模式的关系
引言在学习访问者模式的过程中了解到了单双分派这一词,本文将重点为大家解释Java中的单分派与双分派到底是什么,以及为什么会与访问者模式扯上关系首先,我们给出一个定义:“Java是一种支持双分派的单分派语言”。那么我们必须知道什么是分派,我所理解的分派对要执行的方法的确定,用通俗的话来说就是我需要知道我执行的是哪个对象的哪个方法。那么为什么会出现单分派以及多分派?我们不是可以通过方法名来确定我们要调什么方法吗?是的,若要调用一个方法,方法名是最关键的一个标识,这是基础,总不能我们不用知道我们要调原创 2022-01-10 00:02:31 · 726 阅读 · 5 评论 -
代理模式及Java两种动态代理JDK动态代理和CGLIB动态代理
代理模式什么是代理模式代理模式是设计模式的一种,他是指一个对象A通过持有另一个对象B,可以具有B同样的行为的模式。他在对象B的基础上提供了一层访问控制,当你需要访问对象B时,你需要经过对象B的代理对象A来实现访问。因此代理模式也被称为委托模式,他能够提供非常好的访问控制。对象A并不提供真正的执行逻辑,而是通过组合B去调用B的目标方法来实现目标逻辑。而A的作用则是在调用B方法的前后提供一些准备和善后的工作。即A虽然是“伪军”,但它可以增强B,在调用B的方法前后都做些其他的事情。Spring AOP就是使原创 2022-01-05 11:24:45 · 1548 阅读 · 0 评论 -
设计模式——桥梁模式
定义将抽象和实现解耦,是两者可以独立变化抽象定义了要做什么,而实现定义了如何去做。如果是继承结构,抽象发生变化时需修改抽象方法,违背了开闭原则。而桥接模式由于分离了抽象和实现,使得抽象方法可以通过拓展抽象来实现拓展结构和实现抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。实现化(Implementor)角色:定义实现原创 2020-10-15 13:51:44 · 152 阅读 · 0 评论 -
设计模式——享元模式
定义使用共享对象可有效地支持大量细粒度的对象在享元模式中可以共享的相同内容称为 内部状态(Intrinsic State),而那些需要外部环境来设置的不能共享的内容称为 外部状态(Extrinsic State),其中外部状态和内部状态是相互独立的,外部状态的变化不会引起内部状态的变化。由于区分了内部状态和外部状态,因此可以通过设置不同的外部状态使得相同的对象可以具有一些不同的特征,而相同的内部状态是可以共享的。也就是说,享元模式的本质是分离与共享 : 分离变与不变,并且共享不变。把一个对象的状态分原创 2020-10-15 10:34:08 · 195 阅读 · 0 评论 -
设计模式——解释器模式
定义给定一门语言,定义它文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子解释器这个名词想必大家都不会陌生,比如编译原理中,一个算术表达式通过词法分析器形成词法单元,而后这些词法单元再通过语法分析器构建语法分析树,最终形成一颗抽象的语法分析树。诸如此类的例子也有很多,比如编译器、正则表达式等等。如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子,这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。就比如正则表达式,它原创 2020-10-15 10:03:14 · 147 阅读 · 0 评论 -
设计模式——状态模式
定义状态中封装了该状态所能做的行为,不同的状态对应不同的行为。通过改变状态来实现行为的变化。将状态与行为耦合,分离了行为与执行者间的关系也就是说,状态模式将行为的实现与状态对象进行绑定,执行者通过执行状态下对应的方法来实现对应状态下的行为结构和实现结构上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete State对象来处理。抽象状态(State):定义一个接口以封装使用上下文环境的的一个特定状态相关的原创 2020-10-15 09:26:28 · 99 阅读 · 0 评论 -
设计模式——访问者模式
定义封装一些作用于某种数据结构中的各个元素的操作,它可以在不改变数据结构的前提下定义作用于这些新元素的新的操作简单来说,我们让目标对象接纳一个访问者,通过这个访问者将自身实例放入访问者中,因此,在外部的访问者就可以独立获取到目标对象内部的数据接口,这种模式分离了数据的结构和操作。适合数据结构稳定但数据表现容易出现变化的场景比如我们现在有一组对象,被放置在某个数据结构中,但现在不同的人无需要的数据重点不同,但是,不管重点在哪,他们需要的东西都在这组数据中。但是我们不可能将数据的全貌全部表现给使用者看原创 2020-10-14 19:25:46 · 190 阅读 · 0 评论 -
设计模式——备忘录模式
定义在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态换句话说,当我们正常需要将一个对象恢复到前者的状态时,我们必须要直到该对象内部封装的细节。但是这样很明显会使得两个对象之间的耦合过高,是不可取的,因此我们需要一个备忘录来对数据的状态进行记录,从而降低对象之间的耦合关系结构和实现结构发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的原创 2020-10-14 18:39:27 · 98 阅读 · 0 评论 -
设计模式——观察者模式
定义观察者模式也叫发布订阅模式,该模式定义对象间一种一对多的依赖关系,使得没当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新观察者一般可以看做是第三者,比如在学校上自习的时候,大家肯定都有过交头接耳、各种玩耍的经历,这时总会有一个“放风”的小伙伴,当老师即将出现时及时“通知”大家老师来了。再比如,拍卖会的时候,大家相互叫价,拍卖师会观察最高标价,然后通知给其它竞价者竞价,这就是一个观察者模式。结构和实现结构Subject被观察者:定义被观察者必须实现的职责,它必须能够动态原创 2020-10-14 18:13:58 · 89 阅读 · 0 评论 -
设计模式——面门模式
定义要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用对一些固定顺序的方法进行整合,由某个函数获取必要的参数来完成执行。避免了方法的顺序错误调用,我们可以直接认为这是对多个函数的封装,由一个公开的接口来收集被封装函数所需的必要参数。可以参考下图结构和实现结构角色定义:Facade门面角色客户端可以调用这个角色的方法。此角色知晓子系统的所有功能和责任。一般情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去,原创 2020-10-14 17:28:40 · 225 阅读 · 0 评论 -
设计模式——组合模式
定义将对象组合成树形结构以表示“部分—整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性个人理解:利用组件化思想,将对象的通用部分抽取出来设计成通用组件,并增加聚合通用组件到自身的能力,每个具体组件同时实现/继承通用组件来实现个性。这样一次通过组合不同的组件到自身就形成一个树状的结构。同时由于所有组件都实现自同一通用组件,因此在对单点或是整颗树的使用上具有一致性结构和实现结构组合模式主要包含如下几个角色:Component :组合中的对象声明接口,在适当的情况下,实现所有类共原创 2020-10-14 16:36:24 · 124 阅读 · 0 评论 -
设计模式——迭代模式
定义迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。以List为例我们都知道List最常用的有两种结构,一种是链表一种是数组,数组通过下标去遍历元素,而链表则通过访问下个节点去遍历元素,也就是说这两个遍历元素的方式是不同的如果我们要使用就需要我们熟悉我们要用的容器的数据结构,但这种方式并不可取。增加了学习成本已经降低的程序的通用性和可扩展性。因此我们引入迭代器模式来隐藏具体的遍历细节,从而通过一个方式就可以遍历所有容器元素结构和实现结构原创 2020-10-14 16:10:37 · 261 阅读 · 0 评论 -
设计模式——适配器模式
定义将某个类的接口转换成使用者期望的另一个接口表示,主要目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。在适配器模式中,我们通过增加一个新的适配器类来解决接口不兼容的问题,使得原本没有任何关系的类可以协同工作。根据适配器类与适配者类的关系不同,适配器模式可分为对象适配器和类适配器两种,在对象适配器模式中,适配器与适配者之间是关联关系;在类适配器模式中,适配器与适配者之间是继承(或实现)关系。角色结构和实现结构Target(目标抽象类):目标抽象类定义客户所需接口,原创 2020-10-14 14:52:15 · 143 阅读 · 0 评论 -
设计模式——策略模式
定义定义一组算法,将每组算法封装起来,并且使它们可以互换话句话说策略模式就是将算法逻辑作为可更换的部分,根据实际场景调用不同的算法结构和实现结构Context上下文:Context上下文角色,也叫Context封装角色,起承上启下的作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。抽象策略角色抽象策略角色,是对策略、算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性。具体策略角色用于实现抽象策略中的操作,即实现具体的算法实现以三国为例,三国时期有原创 2020-10-14 13:59:39 · 139 阅读 · 0 评论 -
设计模式——装饰者模式
定义动态地为一个对象添加一些额外职责,就增加功能而言,装饰者模式相比生成子类更为灵活从形式上来说它会有点像AOP中的代理模式,通过聚合目标对象来实现功能增强。但不同的是,装饰者模式更灵活,它能够同时嵌套多层也就是为同一个对象增强多次,同时这种增强是根据使用者需求的变化而即时改变的。双方侧重点不同,装饰者模式的重点在于拓展目标对象的功能,而代理模式则是提供访问控制。装饰者模式在Java的IO结构中体现的淋漓尽致结构和实现结构从结构上看其实与代理模式就有些相像,通过将继承自同一接口的对原创 2020-10-13 18:35:51 · 153 阅读 · 0 评论 -
设计模式——责任链模式
定义使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系,将这些对象构成链,沿着这条链传递请求,直到对象处理完为止责任链,顾名思义,就是用来处理相关事务责任的一条执行链,执行链上有多个节点,每个节点都有机会(条件匹配)处理请求事务,如果某个节点处理完了就可以根据实际业务需求传递给下一个节点继续处理或者返回处理完毕。结构和实现结构抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。具体处理者(Concrete Handler)原创 2020-10-13 10:57:18 · 165 阅读 · 0 评论 -
设计模式——命令模式
定义命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志。以及支持可撤销的操作。说白了,就是将一系列的请求命令封装起来,不直接调用真正执行者的方法,这样比较好扩展。结构和实现Command(抽象命令类):抽象出命令对象,可以根据不同的命令类型。写出不同的实现类ConcreteCommand(具体命令类):实现了抽象命令对象的具体实现Invoker(调用者/请求者):请求的发送者,它通过命令对象来执行请求。一个调用者并不需要在设计时原创 2020-10-13 09:50:40 · 131 阅读 · 0 评论 -
设计模式——中介者模式
定义用一个中介对象封装一系列对象交互,使各个对象不必显式地相互作用,从而使其耦合松散结构和实现结构中介者模式在我看来就是一种星形拓扑结构,所有角色通过中介者实现协作抽象中介者:定义了各个同事之间交互需要的方法。具体中介者:需要了解维护各个同事对象,并且负责协调各个具体同事之间的交互。抽象同事类:约束具体同事类的类型、并且实现一些具体同事类之间的公共方法。具体同事类:实现自己的业务。代码实现略过模式特点优点:将原本一对多的依赖变成了一对一的依赖,同时,角色间耦原创 2020-10-13 09:15:24 · 109 阅读 · 0 评论 -
设计模式——原型模式
复制粘贴功能我们都用过,我们可以把一个文件从一个地方复制到另外一个地方,复制完成之后这个文件和之前的文件也没有一点差别,这就是原型模式的思想:首先创建一个实例,然后通过这个实例去拷贝创建新的实例。这篇文章就好好地分析一下原型模式。定义原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。由于我们正常对于引用对象的拷贝属于引用复制,当多个变量指向同一对象时,一个变量做出修改后,其他所有变量都会获取到被修原创 2020-10-13 09:05:37 · 103 阅读 · 0 评论 -
设计模式——模板模式
定义定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤。通俗点的理解就是 :完成一件事情,有固定的数个步骤,但是每个步骤根据对象的不同,而实现细节不同;就可以在父类中定义一个完成该事情的总方法,按照完成事件需要的步骤去调用其每个步骤的实现方法。每个步骤的具体实现,由子类完成。类图抽象父类(AbstractClass):实现了模板方法,定义了算法的骨架。具体类(ConcreteClass):实现抽象类中的抽象方法,即不同的对象的原创 2020-10-12 18:52:24 · 105 阅读 · 0 评论 -
设计模式——建造者模式
定义将一个复杂对象的构建和表示分离,使得同样的而构建方式可创建不同的表示。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。该模式的主要优点如下:封装性好,构建和表示分离。扩展性好,各个具体的建造者相互独立,有利于系统的解耦。客户端不必知道产品内部组成的细节,建造者可以对创建过程逐步细化,而不对其它模块产生任何影响,便于控制细节风险。其缺点如下:产品的组成部分必须相同,这限制了其使用范围。如果产原创 2020-10-12 18:37:59 · 284 阅读 · 0 评论 -
设计模式——工厂模式
1. 工厂模式定义工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。2. 作用通过工厂模式,将创建产品实例的权利移交工厂,我们不再通过new来创建我们所需的对象,而是通过工厂来获取我们需要的产品。降低了产品使用者与使用者之间的耦合关系3. 类图这里的工厂与产品为一对一的关系,属于简单工厂.原创 2020-10-12 17:19:53 · 29309 阅读 · 30 评论 -
设计模式——单例模式
单例模式在一个应用中保证某个类只存在单一实例(示例:springMVC中的bean可以设置为singleton)下面介绍几种单例模式的实现:1. 静态常量public class SingletonClass1 { private static SingletonClass1 singletonClass = new SingletonClass1(); private SingletonClass1(){} public static SingletonClass1 g原创 2020-10-12 15:23:01 · 116 阅读 · 0 评论 -
设计模式——六大原则
1.总原则-开闭原则定义对扩展开放,对修改封闭。在程序需要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码,实现一个热插拔( 即带电插拔,指的是在不关闭系统电源的情况下,将模块、板卡插入或拔出系统而不影响系统的正常工作)的效果。意思就是当程序需要变化时,通过继承原有类进行重写或者新增完成功能拓展开闭原则是其他五种原则的抽象,其他五种原则是围绕开闭原则的具体设计想要达到这样的效果,我们需要使用接口和抽象类等,后面的具体设计中我们会提到这点。2、单一职责原则定义:一个方法/类应只负责一个原创 2020-10-12 14:42:05 · 132 阅读 · 0 评论