设计模式
文章平均质量分 58
在 http://c.biancheng.net/design_pattern/ 网站学习的,然后结合自己的理解分别记录一下这些设计模式的应用,厚着脸皮标个原创。
你男朋友
我喜欢的那匹驹身上,有锦,润而不耀,与龙同尘
展开
-
简单工厂模式
定义创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中,满足“创建与使用相分离”;在简单工厂模式中创建实例的方法通常为静态(static)方法;架构抽象产品、具体产品、简单工厂代码Bee(抽象产品)public interface Bee { String product();}ABee(具体产品)public class ABee implements Bee { @Override public String product() {原创 2021-07-23 21:19:17 · 216 阅读 · 0 评论 -
抽象工厂模式
定义将一个具体工厂所生产的位于不同等级的一组产品称为一个产品族,是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无需指定所要产品的具体类就能得到同族的不同等级的产品的模式结构架构抽象工厂、具体工厂、抽象产品、具体产品理解“现代化工厂”代码AbstractFactory(抽象工厂):public interface AbstractFactory { /**创建产品的方法*/ NewBeeA creatNewBeeA(); NewBeeB creatN原创 2021-07-07 17:25:08 · 140 阅读 · 0 评论 -
工厂方法模式
定义只考虑一种产品的生产,即工厂方法模式只考虑同等级的产品,用户只需要知道工厂的名字就可以创建相应的产品架构抽象工厂、具体工厂、抽象产品、具体产品代码Factory(抽象工厂)public interface Factory { NewBee make();}FactoryA(具体工厂A)public class FactoryA implements Factory { @Override public NewBee make() { S原创 2021-07-21 21:23:22 · 104 阅读 · 0 评论 -
单例模式.
定义只创建一个对象模式懒汉模式:调用类中的实例化方法的时候才创建饿汉模式:类加载的时候就进行对象的创建简单说,创建对象的顺序不一样;扩展可以将多个单例存放到链表中,当需要使用的时候直接从链表中拿就可以了代码SingletonHungry(饿汉模式)/** * * Description: * 单例模式,饿汉模式 * @author: mushi * @Date: 2021/2/4 14:18 */public class SingletonHungry原创 2021-07-23 21:29:21 · 113 阅读 · 0 评论 -
责任链模式
定义为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生的时候,可以将请求随着你制定好的链条进行传送,知道链路中的某一环处理为止,通常情况下,可以通过数据链表来实现职责链模式的数据结构。(请求在一条链路中传递,被链路中某个环节进行处理)架构抽象处理者、处理者、客户类应用场景mybatis处理session的执行器executor就采用了责任链模式,在写mybatis插件的时候需要实现Interceptor这个接口再去定义自原创 2021-07-09 16:16:32 · 123 阅读 · 0 评论 -
策略模式.
定义完成一个流程有多种策略,择优;定义一系列规则,并将每个规则封装起来,使它们可以相互替换,并且规则的变化不会影响执行规则的对象,通过对规则的封装把规则的条件和规则的结果分割开。架构抽象策略:各种不同的规则以不同的方式实现这个接口,环境角色使用这个接口调用不同的规则;具体策略:实现了抽象策略定义的接口,提供具体的规则实现;环境类:持有一个策略类的引用,最终给客户端调用。应用场景1、一个系统需要动态地在几种规则中选择一种时,可将每个规则封装到策略类中;2、 一个类定义了多种行为,并且这些行为原创 2021-07-23 22:21:41 · 146 阅读 · 1 评论 -
访问者模式
定义将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新操作;为数据结构中的每个元素提供多种访问方式,将对数据的操作与数据结构进行分离。架构抽象访问者:定义一个访问具体元素的接口,为每个具体元素类对应一个访问操作,该操作中的参数类型代表被访问的具体元素;具体访问者:确定一个访问者访问元素的时候做些什么;抽象元素:声明一个包含接收操作的接口,被接收的访问者对象作为接收方法的参数;具体元素:实现被接收的访问者对象要做的操作;对象结构:是原创 2021-07-25 17:06:30 · 120 阅读 · 0 评论 -
装饰模式.
作用在不改变现有对象结构的前提下动态地给对象增加一些职责(即扩展功能)架构抽象角色、具体角色、抽象装饰角色、具体装饰角色应用场景1、当需要给一个现有类添加附加职责,而又不能采用生成子类的方法进行扩充的时。举个例子,一个类被隐藏或者这个类是终极类(final修饰的类)或者采用继承方式会产生大量的子类(入侵性强);2、当需要通过现有的一组基本功能进行排列组合而产生非常多的功能时,采用继承关系很难实现,使用装饰模式却很好实现;3、当对象的功能要求可以动态地添加也可以再动态地撤销时。代码...原创 2021-07-25 16:40:52 · 98 阅读 · 0 评论 -
享元模式.
定义利用共享技术支持大量对象的复用、通过共享已经存在的对象来大幅度减少需要创建对象的数量,换句话说相同的对象只保留一份。本质缓存共享对象、降低内存消耗架构抽象享元角色、具体享元角色、非享元角色、享元工厂角色代码...原创 2021-07-25 16:20:26 · 87 阅读 · 0 评论 -
状态模式.
定义对有状态的对象,把复杂的判断逻辑提取到不同的状态对象中,允许其状态对象在其内部状态发生改变时改变其行为;架构环境类:也称为上下文,它定义了客户端需要的接口,内部维护一个当前状态,并负责具体状态的切换;抽象状态:定义一个接口,用以封装环境对象中的特定状态所对应的行为,可以有一个或多个行为;具体装态:实现抽象状态所对应的行为,并且在需要的情况下进行状态切换;应用场景1、当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时;2、一个操作中含有庞大的分支结构,并且这些分支决定原创 2021-07-23 21:47:45 · 113 阅读 · 0 评论 -
代理模式.
定义由于某些原因需要给某对象提供一个代理以控制对该对象的访问,这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。架构抽象主题类、真实主题类、代理类分类{静态代理:手动创建代理类{动态代理:使用反射动态创建作用保护真实对象,增强真实对象代码Subject(抽象主题)/** * 代理类和目标类共同实现的接口 */public interface Subject { void show();}Target(真实主题)/**原创 2021-07-23 21:01:47 · 87 阅读 · 0 评论 -
原型模式.
定义本质就是实现一个对象的克隆,Java自带的原型模式基于内存二进制流的复制,比new一个对象的性能更好;Object的clone()方法就可以实现原型 --克隆体;简述如果需要多个实例,可以通过创建一个实例然后通过克隆的方式来快速得到多个相同或相似的实例,因为创建实例需要的时间和资源比复制要多。这里再说一说克隆,Object自带clone()方法,我们知道Object是所有类的父类,也就是说所有的类都可以通过clone()方法来获得一个克隆体,那么在克隆之后是得到一个一模一样的对象存放在同一个地原创 2021-07-23 20:33:30 · 98 阅读 · 0 评论 -
观察者模式
定义多个对象之间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都得到通知并执行相应的行为;有点消息队列的意思架构抽象主题:提供一个用于保存订阅者对象的聚集类和增加、删除订阅者对象的方法,以及通知所有订阅者的抽象方法;具体主题:实现抽象主题中的通知方法,当具体主题的内部状态发生变化的时候通知所有注册过的观察者对象;抽象订阅者:可以是抽象类也可以是接口,包含一个更新自己的抽象方法,当接到具体主题的更改通知时被调用;具体订阅者:实现抽象订阅者中的抽象方法,以便在得到目标的更改通知时原创 2021-07-23 19:53:25 · 104 阅读 · 0 评论 -
模板方法模式
定义定义一个操作中的算法骨架,将算法中的一些步骤延伸到子类,使得子类可以不改变算法结构的情况下重新定义该算法的某些特定步骤架构模板:模板中定义抽象方法(子类重写)和基本方法(非抽象方法,子类可直接调用);扩展应用场景1、算法整体步骤固定,其中个别容易改变的时候可以使用模板方法模式将容易改变的地方抽离,供子类实现;2、当多个子类存在公共的行为的时候,可以将其提取出来并集中到一个公共父类中以避免代码重复,首先,要识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的原创 2021-07-23 00:16:50 · 115 阅读 · 0 评论 -
备忘录模式
定义在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后需要时能够将该对象恢复到原来保存时的状态,类似于事务回滚,本质就是可以有一次后悔操作。架构发起人:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的方法,可以访问备忘录里的所有信息;备忘录:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人;管理者:对备忘录进行管理,提供保存和获取备忘录的方法,但不能对备忘录进行访问和修改;应用场景1、需要保存与恢复数据的场景;2、需要提供一个可回滚原创 2021-07-22 23:53:09 · 80 阅读 · 0 评论 -
中介者模式
定义定义一个中介对象来封装一系列对象之间的交互,使原有对象解耦,且可以独立的改变它们之间的交互。架构抽象中介者:是中介者的接口,提供同事对象注册与转发同事对象信息的抽象方法;具体中介者:定义一个容器来管理对象,协调各个同事角色之间的交互关系,因此依赖于同事角色;抽象同事:保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能;具体同事:当需要与其他同事对象交互的时候由中介者对象负责后续的交互;应用场景1、当对象之间存在复杂的网状结构关系而导致依赖关系混乱且难以复用时;原创 2021-07-22 23:30:48 · 112 阅读 · 0 评论 -
迭代器模式
定义提供一个对象来顺序访问聚合对象中的所有数据,不暴露聚合对象的内部表示架构抽象聚合:定义操作【存储、添加、删除】聚合对象以及创建迭代器对象具体聚合:返回一个具体的迭代器;抽象迭代器:定义访问和遍历聚合元素的接口,通常包含hasNext()、first()、next() 等方法;具体迭代器:完成对聚合对象的遍历,记录遍历的当前位置应用场景1、对一组元素提供多种遍历方式2、遍历不同组提供的一个统一接口3、访问一组元素中的一个对象的内容而无需暴露内部细节代码Aggregate(抽象聚合原创 2021-07-21 21:58:12 · 96 阅读 · 0 评论 -
外观模式.
这个模式挺简单的,理念有点像组合模式,“通过一个对象的行为去操作一批对象的行为”,但实现方式上面比组合模式简单。定义一个高层接口,包含对各个子系统的引用,客户端可以通过这个接口访问各个子系统;架构外观角色、子系统代码Facade/** * * Description: * 外观角色 * @author: mushi * @Date: 2021/2/6 11:41 */public class Facade { private SubSystem01原创 2021-07-20 22:23:52 · 85 阅读 · 0 评论 -
组合模式.
定义将对象组合成树状的层次结构,用来表示“整体-部分”的关系 使用户对单个对象和组合对象具有一致性根节点–树枝节点–叶子节点根节点和树枝节点的本质是一种数据类型,可以作为容器使用,叶子节点和树枝节点不属于一种类型;组合模式中将树枝节点和叶子节点看作是同一种数据类型(用统一接口定义)让他们具有一致行为架构抽象组件角色、树叶组件角色、、树枝组件角色/中间组件两种实现模式透明式:抽象组件声明了所有子类中的全部方法,客户端无需区别树枝对象和叶子对象,对客户端来说是透明的,树叶组件没有添加、移除、和原创 2021-07-18 23:12:57 · 95 阅读 · 0 评论 -
命令模式.
定义将一个请求封装成一个对象,使发请求的责任和处理请求的责任分隔开,这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增加和管理。架构抽象命令类:声明执行命令的接口,拥有执行命令的抽象方法(接口中声明一个执行命令的方法);具体命令类:抽象命令类的具体实现类,拥有接收者对象,并通过调用接收者的功能来完成命令要执行的操作(注入命令接收者对象,调用接收者对象的方法);实现者/接收者:执行命令功能的相关操作,是具体命令对象业务的真正实现者(最终要调用的是这个角色中的方法);调用者原创 2021-07-18 00:21:55 · 90 阅读 · 0 评论 -
建造者模式
定义将一个复杂对象的构造与它的表示分离开,使同样的构建过程可以创建不同的表示。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建成最终的对象。它将变与不变分离开,即产品的组合不变,但每一部分可以灵活的选择。和工厂方法模式的区别建造者模式注重零部件的组装过程,工厂方法模式更注重零部件的创建过程,两者可以结合使用。1、建造者模式更注重方法的调用顺序,工厂模式注重创建对象;2、创建对象的力度不同,建造者模式创建的是复杂的对象,由各种复杂的部件构成,工厂模式创建出来的对象都是一样的;3、关注点原创 2021-07-09 15:40:41 · 101 阅读 · 0 评论 -
桥接模式.
定义将抽象与实现分离,使它们可以独立变化,聚合关系建立在抽象层,要求针对抽象化进行设计和开发一个对象可以按照不同的类型进行分类,每一个类型就是一个维度,在桥接模式中,维度用接口定义,维度的具体描述要实现这个接口并重写这个接口中的方法来给这个维度定义一个准确的描述。如果一个维度要引用另一个维度,那么这个维度用抽象类定义,类中要包含所有引用维度的对象。也就是说用接口定义的维度可以被用抽象定义的维度进行引用。架构抽象化角色、扩展抽象化角色、实体化、具体实现化角色使用场景当一个类内部具备两种或者多种变化原创 2021-07-09 15:14:01 · 98 阅读 · 0 评论 -
适配器模式
类型:类结构模式和对象结构模式1、类结构模式采用继承的方式来组织接口和类(不推荐,因为Java单继承 能用接口就尽量用接口)2、对象结构模式采用组合或聚合来组织对象作用:客户端通过适配器可以透明的调用目标接口架构:目标接口、适配者类、适配器类代码:对象适配器模式:Adapteepublic class Adaptee { public void specific(){ System.out.println("我是适配者"); }}Adapte原创 2021-07-07 17:54:16 · 154 阅读 · 0 评论