设计模式
文章平均质量分 50
设计模式学习积累
源码地址:
https://github.com/L1-Guogang/top/tree/designPattern
大都督老师
爱老婆不能只停留在口头上
展开
-
访问者模式
定义访问者模式(Visitor Pattern)是一种将数据结构与数据操作分离的设计模式,指封装一些作用于某种数据结构中的各元素的操作,可以在不改变数据结构的前提下定义作用于这些元素的新的操作,属于行为型设计模式。应用场景数据结构稳定,作用于数据结构的操作经常变化的场景。需要数据结构与数据操作分离的场景。需要对不同数据类型(元素)进行操作,而不使用分支判断具体类型的场景。访问者模式主要包含5个角色抽象访问者(IVisitor):接口或抽象类,该类定义了一个visit()方法用于访问每一个原创 2021-03-13 12:07:38 · 176 阅读 · 0 评论 -
观察者模式
定义观察者模式(Observer Pattern)又叫作发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependent)模式。定义一种一对多的依赖关系,一个主题对象可被多个观察者对象同时监听,使得每当主题对象状态变化时,所有依赖它的对象都会得到通知并被自动更新,属于行为型设计模式。应用场景当一个抽象模型包含两方面内容,其中一方面依赖另一方面。其他一个或多个对象的变化依赖另一个对象的变化。实原创 2021-03-13 11:40:33 · 179 阅读 · 0 评论 -
解释器模式
定义解释器模式(Interpreter Pattern)指给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。解释器模式是一种按照规定的文法(语法)进行解析的模式,属于行为型设计模式。应用场景一些重复出现的问题可以用一种简单的语言进行表达。一个简单语法需要解释的场景。解释器模式主要包含4个角色抽象表达式(IExpression):负责定义一个解释方法interpret,交由具体子类进行具体解释。终结符表达式(TerminalExpression)原创 2021-03-13 11:16:19 · 202 阅读 · 0 评论 -
中介者模式
定义中介者模式(Mediator Pattern)又叫作调解者模式或调停者模式。用一个中介对象封装一系列对象交互,中介者使各对象不需要显式地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互,属于行为型设计模式。应用场景系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解。交互的公共行为,如果需要改变行为,则可以增加新的中介者类。中介者模式主要包含4个角色抽象中介者(Mediator):定义统一的接口,用于各个同事角色之间的通信。具体中介者(ConcreteM原创 2021-03-07 13:27:50 · 113 阅读 · 0 评论 -
备忘录模式
备忘录模式的定义备忘录模式(Memento Pattern)又叫作快照模式(Snapshot Pattern)或令牌模式(Token Pattern),指在不破坏封装的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态,属于行为型设计模式。备忘录模式的应用场景需要保存历史快照的场景。希望在对象之外保存状态,且除了自己,其他类对象无法访问状态保存的具体内容。备忘录模式主要包含3个角色。发起人角色(Originator):负责创建一个备忘录,记录原创 2021-03-06 18:31:53 · 100 阅读 · 0 评论 -
状态模式
状态模式的定义状态模式(State Pattern)也叫作状态机模式(StateMachine Pattern),允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类,属于行为型设计模式。状态模式中类的行为是由状态决定的,在不同的状态下有不同的行为。其意图是让一个对象在其内部改变的时候,行为也随之改变。状态模式的核心是状态与行为绑定,不同的状态对应不同的行为。状态模式的应用场景行为随状态改变而改变的场景。一个操作中含有庞大的多分支结构,并且这些分支取决于对象的状态。状态模式主原创 2021-03-01 22:01:07 · 1035 阅读 · 0 评论 -
命令模式
命令模式的定义命令模式(Command Pattern)是对命令的封装,每一个命令都是一个操作:请求方发出请求要求执行一个操作;接收方收到请求,并执行操作。命令模式解耦了请求方和接收方,请求方只需请求执行命令,不用关心命令怎样被接收、怎样被操作及是否被执行等。命令模式属于行为型设计模式。命令模式的应用场景现实语义中具备“命令”的操作(如命令菜单、Shell命令等)。请求的调用者和接收者需要解耦,使得调用者和接收者不直接交互。需要抽象出等待执行的行为,比如撤销(Undo)操作和恢复(Redo)等操原创 2021-03-01 21:30:17 · 176 阅读 · 0 评论 -
迭代器模式
迭代器模式的定义迭代器模式(Iterator Pattern)又叫作游标模式(Cursor Pattern),它提供一种按顺序访问集合/容器对象元素的方法,而又无须暴露集合内部表示。迭代器模式可以为不同的容器提供一致的遍历行为,而不用关心容器内元素的组成结构,属于行为型设计模式。迭代器模式的应用场景访问一个集合对象的内容而无须暴露它的内部表示。为遍历不同的集合结构提供一个统一的访问接口。迭代器模式主要包含4个角色抽象迭代器(Iterator):抽象迭代器负责定义访问和遍历元素的接口。具体原创 2021-02-25 22:38:13 · 158 阅读 · 0 评论 -
责任链模式
责任链模式的定义责任链模式(Chain of Responsibility Pattern)将链中每一个节点都看作一个对象,每个节点处理的请求均不同,且内部自动维护下一个节点对象。当一个请求从链式的首端发出时,会沿着责任链预设的路径依次传递到每一个节点对象,直至被链中的某个对象处理为止,属于行为型设计模式。责任链模式的应用场景多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定。在不明确指定接收者的情况下,向多个对象中的一个提交请求。可动态指定一组对象处理请求。责任链模式主要包含原创 2021-02-19 22:47:11 · 106 阅读 · 0 评论 -
策略模式
策略模式的定义策略模式(Strategy Pattern)又叫作政策模式(Policy Pattern),它将定义的算法家族分别封装起来,让它们之间可以互相替换,从而让算法的变化不会影响到使用算法的用户,属于行为型设计模式。策略模式的应用场景针对同一类型问题,有多种处理方式,每一种都能独立解决问题。需要自由切换算法的场景。需要屏蔽算法规则的场景。策略模式主要包含3个角色上下文角色(Context):用来操作策略的上下文环境,屏蔽高层模块(客户端)对策略、算法的直接访问,封装可能存在的变化原创 2021-02-19 22:24:31 · 152 阅读 · 0 评论 -
模板方法模式
模板方法模式的定义模板方法模式(Template Method Pattern)又叫做模板模式,指定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤,属于行为型设计模式。模板方法模式实际上封装了一个固定流程,该流程由几个步骤组成,具体步骤可以由子类进行不同的实现,从而让固定的流程产生不同的结果。它非常简单,其实就是类的继承机制,但它却是一个应用非常广泛的模式。模板方法模式的本质是抽象封装流程,具体进行实现。模板方法模式的应用场景当完成原创 2021-02-15 10:55:01 · 423 阅读 · 0 评论 -
委派模式
委派模式的定义委派模式(Delegate Pattern)又叫作委托模式,是一种面向对象的设计模式,允许对象组合实现与继承相同的代码重用。它的基本作用就是负责任务的调用和分配,是一种特殊的静态代理模式,可以理解为全权代理模式,但是代理模式注重过程,而委派模式注重结果。委派模式属于行为型设计模式,不属于GoF的23种设计模式。委派模式的应用场景需要实现表现层和业务层之间的松耦合。需要编排多个服务之间的调用。需要封装一层服务查找和调用。委派模式有3个参与角色抽象任务角色(ITask):定义一原创 2021-02-14 17:43:15 · 787 阅读 · 1 评论 -
桥接模式
桥接模式的定义桥接模式(Bridge Pattern)又叫作桥梁模式、接口(Interface)模式或柄体(Handle and Body)模式,指将抽象部分与具体实现部分分离,使它们都可以独立地变化,属于结构型设计模式。桥接模式的应用场景在抽象和具体实现之间需要增加更多灵活性的场景。一个类存在两个(或多个)独立变化的维度,而这两个(或多个)维度都需要独立进行扩展。不希望使用继承,或因为多层继承导致系统类的个数剧增。桥接模式主要包含4个角色抽象(Abstraction):该类持有一个对实原创 2021-02-09 21:34:47 · 256 阅读 · 0 评论 -
适配器模式
适配器模式的定义适配器模式(Adapter Pattern)又叫作变压器模式,它的功能是将一个类的接口变成客户端所期望的另一种接口,从而使原本因接口不匹配而导致无法在一起工作的两个类能够一起工作,属于结构型设计模式。适配器模式的应用场景已经存在的类,它的方法和需求不匹配(方法结果相同或相似)的情况。适配器模式不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产品、不同厂家造成功能类似而接口不相同情况下的解决方案,有种亡羊补牢的感觉。适配器模式有3种形式类适配器、对象适配器、接口适配器原创 2021-02-09 21:13:54 · 142 阅读 · 0 评论 -
组合模式
组合模式的定义组合模式(Composite Pattern)又叫作整体-部分(Part-Whole)模式,它的宗旨是通过将单个对象(叶子节点)和组合对象(树枝节点)用相同的接口进行表示,使得客户对单个对象和组合对象的使用具有一致性,属于结构型设计模式。组合模式一般用来描述整体与部分的关系,它将对象组织到树形结构中,顶层的节点被称为根节点,根节点下面可以包含树枝节点和叶子节点,树枝节点下面又可以包含树枝节点和叶子节点组合模式的应用场景当子系统与其内各个对象层次呈树形结构时,可以使用组合模式让子系统内各原创 2021-02-06 18:24:57 · 145 阅读 · 0 评论 -
享元模式
享元模式的定义享元模式(Flyweight Pattern)又叫作轻量级模式,是对象池的一种实现。类似线程池,线程池可以避免不停地创建和销毁多个对象,消耗性能。享元模式提供了减少对象数量从而改善应用所需的对象结构的方式。其宗旨是共享细粒度对象,将多个对同一对象的访问集中起来,不必为每个访问者都创建一个单独的对象,以此来降低内存的消耗,属于结构型设计模式。享元模式把一个对象的状态分成内部状态和外部状态,内部状态是不变的,外部状态是变化的;然后通过共享不变的部分,达到减少对象数量并节约内存的目的。享元模式原创 2021-02-06 16:31:02 · 133 阅读 · 0 评论 -
装饰器模式
装饰器模式的定义装饰器模式(Decorator Pattern)也叫作包装器模式(Wrapper Pattern),指在不改变原有对象的基础上,动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活,属于结构型设计模式。装饰器模式的应用场景用于扩展一个类的功能,或者给一个类添加附加职责。动态地给一个对象添加功能,这些功能可以再动态地被撤销。需要为一批平行的兄弟类进行改装或加装功能。装饰器模式主要包含4个角色抽象组件(Component):可以是一个接口或者抽象原创 2021-02-06 09:59:47 · 137 阅读 · 0 评论 -
门面模式
门面模式的定义门面模式(Facade Pattern)又叫作外观模式,提供了一个统一的接口,用来访问子系统中的一群接口。其主要特征是定义了一个高层接口,让子系统更容易使用,属于结构型设计模式。门面模式主要包含2个角色外观角色(Facade):也叫作门面角色,是系统对外的统一接口。子系统角色(SubSystem):可以同时有一个或多个SubSystem。每个SubSytem都不是一个单独的类,而是一个类的集合。SubSystem并不知道Facade的存在,对于SubSystem而言,Facade 只原创 2021-02-02 22:19:18 · 152 阅读 · 0 评论 -
JDK动态代理生成对象的步骤
原理JDK动态代理采用字节重组,重新生成对象来替代原始对象,以达到动态代理的目的。JDK动态代理生成对象的步骤获取被代理对象的引用,并且获取它的所有接口,反射获取。JDK动态代理类重新生成一个新的类,同时新的类要实现被代理类实现的所有接口。动态生成Java代码,新加的业务逻辑方法由一定的逻辑代码调用(在代码中体现)。编译新生成的Java代码.class文件。重新加载到JVM中运行。以上过程就叫作字节码重组JDK中有一个规范,在ClassPath下只要是$开头的.class文件,一般都是原创 2021-01-31 13:25:23 · 893 阅读 · 0 评论 -
代理模式
代理模式的定义代理模式(Proxy Pattern)指为其他对象提供一种代理,以控制对这个对象的访问,属于结构型设计模式。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端与目标对象之间起到中介的作用。目的保护目标对象增强目标对象代理模式一般包含3个角色抽象主题角色(ISubject):抽象主题类的主要职责是声明真实主题与代理的共同接口方法,该类可以是接口,也可以是抽象类。真实主题角色(RealSubject):该类也被称为被代理类,该类定义了代理所表示的真原创 2021-01-23 10:39:24 · 162 阅读 · 0 评论 -
建造者模式
建造者模式的定义建造者模式(Builder Pattern)将一个复杂对象的构建过程与它的表示分离,使得同样的构建过程可以创建不同的表示,属于创建型设计模式。对于用户而言,使用建造者模式只需指定需要创建的类型就可以获得对象,创建过程及细节不需要了解构建与表示分离:构建代表对象创建,表示代表对象行为、方法,也就是将对象的创建与行为进行分离(对应到Java代码,其实就是使用接口规定行为,然后由具体的实现类进行构建)。创建不同的表示:也就是具备同样的行为,但是却由于构建的行为顺序不同或其他原因可以创建出原创 2021-01-21 21:20:32 · 152 阅读 · 0 评论 -
原型模式
原型模式的定义原型模式(Prototype Pattern)指原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象,属于创建型设计模式原型模式的核心在于复制原型对象。以系统中已存在的一个对象为原型,直接基于内存二进制流进行复制,不需要再经历耗时的对象初始化过程(不调用构造函数),性能提升许多。当对象的构建过程比较耗时时,可以把当前系统中已存在的对象作为原型,对其进行复制(一般是基于二进制流的复制),躲避初始化过程,使得新对象的创建时间大大缩短原型模式应用场景创建对象成本较大(例如,初始化时原创 2021-01-17 11:49:19 · 157 阅读 · 0 评论 -
单例模式
单例模式的定义单例模式(Singleton Pattern)指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点,属于创建型设计模式。单例模式的应用场景2EE标准中的ServletContext和ServletContextConfig、Spring框架应用中的ApplicationContext、数据库中的连接池等也都是单例模式。对于Java来说,单例模式可以保证在一个JVM中只存在单一实例。单例模式的应用场景主要有以下几个方面。需要频繁创建的一些类,使用单例可以降低系统的内存压力,原创 2021-01-09 18:55:15 · 85 阅读 · 0 评论 -
抽象工厂模式
抽象工厂模式的定义抽象工厂模式(Abstract Factory Pattern)指提供一个创建一系列相关或相互依赖对象的接口,无须指定它们具体的类。意思是客户端不必指定产品的具体类型,创建多个产品族中的产品对象。在抽象工厂模式中,客户端(应用层)不依赖产品类实例如何被创建、实现等细节,强调一系列相关的产品对象(属于同一产品族)一起创建对象,需要大量重复的代码。需要提供一个产品类的库,所有产品以同样的接口出现,从而使客户端不依赖具体实现。抽象工厂模式主要包含4个角色抽象工厂(IAbstractF原创 2021-01-08 21:13:23 · 109 阅读 · 0 评论 -
工厂方法模式
工厂方法模式的定义工厂方法模式(Factory Method Pattern)又叫作多态性工厂模式,指定义一个创建对象的接口,但由实现这个接口的类来决定实例化哪个类,工厂方法把类的实例化推迟到子类中进行。在工厂方法模式中,不再由单一的工厂类生产产品,而是由工厂类的子类实现具体产品的创建。因此,当增加一个产品时,只需增加一个相应的工厂类的子类,实现生产这种产品,便可以解决简单工厂生产太多产品导致其内部代码臃肿(switch …case分支过多)的问题,也符合开闭原则。工厂方法模式的应用场景创建对象需原创 2021-01-06 21:13:35 · 126 阅读 · 0 评论 -
简单工厂模式
简单工厂模式的定义简单工厂模式(Simple Factory Pattern)又叫作静态工厂方法模式(StaticFactory Method Pattern),简单来说,简单工厂模式有一个具体的工厂类,可以生成多个不同的产品,属于创建型设计模式。简单工厂模式不在GoF 23种设计模式之列。简单工厂模式主要包含3个角色简单工厂(SimpleFactory):是简单工厂模式的核心,负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。抽象产品(IProduc原创 2021-01-05 21:08:56 · 198 阅读 · 0 评论 -
软件设计七大原则
设计原则归纳目的开闭原则对扩展开放,对修改关闭降低维护带来的新风险依赖倒置原则高层不应该依赖低层更利于代码结构的升级扩展单一职责原则一个类只干一件事便于理解,提高代码的可读性接口隔离原则一个接口只干一件事功能解耦,高聚合,低耦合迪米特法则不该知道的不要知道之和朋友交流,不和陌生人说话,减少代码臃肿里氏替换原则子类重写方法功能发生改变,不应该影响父类方法的含义防止继承泛滥合成复用原则尽量使用组合实现代码复用,而不使用继承降低...原创 2021-01-04 21:07:16 · 98 阅读 · 0 评论 -
合成复用原则
合成复用原则的定义合成复用原则(Composite/Aggregate Reuse Principle,CARP)指尽量使用对象组合(has-a)或对象聚合(contanis-a)的方式实现代码复用,而不是用继承关系达到代码复用的目的。合成复用原则可以使系统更加灵活,降低类与类之间的耦合度,一个类的变化对其他类造成的影响相对较小。继承,又被称为白箱复用,相当于把所有实现细节暴露给子类。组合/聚合又被称为黑箱复用,对类以外的对象是无法获取实现细节的。我们要根据具体的业务场景来做代码设计,其实也都需要遵循面原创 2021-01-04 20:48:27 · 320 阅读 · 0 评论 -
里氏替换原则
里氏替换原则的定义里氏替换原则(Liskov Substitution Principle,LSP)指如果对每一个类型为T1的对象O1,都有类型为T2的对象O2,使得以T1定义的所有程序P在所有对象O1都替换成O2时,程序P的行为没有发生变化,那么类型T2是类型T1的子类型。里氏替换原则的定义总结如下:子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。子类中可以增加自己特有的方法。当子类的方法重载父类的方法时,方法的前置条件(即方法的输入参数)要比父类的方法更宽松。当子类的方法实现父类的原创 2021-01-03 10:46:10 · 452 阅读 · 0 评论 -
迪米特法则
迪米特法则的定义迪米特法则(Law of Demeter,LoD)又叫作最少知道原则(Least KnowledgePrinciple,LKP),指一个对象应该对其他对象保持最少的了解,尽量降低类与类之间的耦合。迪米特法则主要强调只和朋友交流,不和陌生人说话。出现在成员变量、方法的输入和输出参数中的类都可以被称为成员朋友类,而出现在方法体内部的类不属于朋友类。...原创 2021-01-03 10:42:58 · 168 阅读 · 0 评论 -
接口隔离原则
接口隔离原则的定义接口隔离原则(Interface Segregation Principle,ISP)指用多个专门的接口,而不使用单一的总接口,客户端不应该依赖它不需要的接口。这个原则指导我们在设计接口时,应当注意以下几点。一个类对另一个类的依赖应该建立在最小接口上。建立单一接口,不要建立庞大臃肿的接口。尽量细化接口,接口中的方法尽量少(不是越少越好,一定要适度)。接口隔离原则符合“高聚合、低耦合”的设计思想,使得类具有很好的可读性、可扩展性和可维护性。示例:不同动物的行为来设计不同的接口原创 2021-01-02 11:56:07 · 202 阅读 · 1 评论 -
单一职责原则
单一职责原则的定义单一职责原则(Simple Responsibility Principle,SRP)指不要存在一个以上导致类变更的原因。假设有一个Class负责两个职责,一旦发生需求变更,修改其中一个职责的逻辑代码,有可能会导致另一个职责的功能发生故障。这样一来,这个Class就存在两个导致类变更的原因。如何解决这个问题呢?我们就要分别用两个Class来实现两个职责,进行解耦。后期需求变更维护互不影响。这样的设计,可以降低类的复杂度,提高类的可读性,提高系统的可维护性,降低变更引起的风险。总体来说就是原创 2021-01-02 11:40:45 · 104 阅读 · 0 评论 -
依赖倒置原则
依赖倒置原则的定义依赖倒置原则(Dependence Inversion Principle,DIP)指设计代码结构时,高层模块不应该依赖底层模块,二者都应该依赖其抽象。抽象不应该依赖细节,细节应该依赖抽象。通过依赖倒置,可以降低类与类之间的耦合性,提高系统的稳定性,提高代码的可读性和可维护性,并降低修改程序带来的风险。示例首先创建一个课程的抽象接口ICoursepackage com.liguogang.DIP;public interface ICourse { void stu原创 2021-01-01 20:08:50 · 178 阅读 · 0 评论 -
开闭原则
定义开闭原则(Open-Closed Principle,OCP)指一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。所谓开闭,也正是对扩展和修改两个行为的一个原则。强调的是用抽象构建框架,用实现扩展细节,可以提高软件系统的可复用性及可维护性。开闭原则是面向对象设计中最基础的设计原则。它指导我们如何建立稳定灵活的系统,例如版本更新,我们尽可能不修改源码,但是可以增加新功能。举例需求:首先创建一个课程接口ICourse,再创建一个计算机课程ComputerCourse实现课程接口ICourse,现原创 2020-12-12 11:29:19 · 236 阅读 · 0 评论 -
时序图 Sequence Diagrams
简介时序图(Sequence Diagrams)描述对象之间消息的发送顺序,强调时间顺序。时序图是一个二维图,横轴表示对象,纵轴表示时间,消息在各对象之间横向传递,按照时间顺序纵向排列。用箭头表示消息,用竖虚线表示对象生命线。时序图的作用展示对象之间交互的顺序。将交互行为建模为消息传递,通过描述消息如何在对象间发送和接收来动态展示对象之间的交互相对于其他UML图,时序图更强调交互的时间顺序。可以直观地描述并发进程。时序图组成元素时序图组成元素主要包括:角色(Actor)对象(Obje原创 2020-11-29 10:34:14 · 7610 阅读 · 0 评论 -
类图 Class Diagrams
类图简介类图描述系统中的类,以及各个类之间的关系的静态视图,能够让我们在正确编写代码之前对系统有一个全面的认识。类图是一种模型(静态模型)类型,类图表示类、接口和他们之间的协作关系,用于系统设计阶段。类图用3个矩形拼接表示,最上面的部分标识类的名称,中间的部分标识类的属性,最下面的部分标识类的方法。类与类之间的关系类与类之间的关系(即事物关系)有继承(泛化)关系、实现关系、组合关系、聚合关系、关联关系和依赖关系6种继承关系在继承(Generalization,又叫作泛化)关系中,子类继承父类原创 2020-11-28 12:26:37 · 605 阅读 · 0 评论 -
UML
定义统一建模语言 Unified Modeling Language, UML是一种为面向对象系统的产品进行说明、可视化和编制文档的标准语言,是非专利的第三代建模和规约语言。UML是一种面向对象设计的建模工具,是在开发阶段说明、可视化、构建和书写一个面向对象软件密集系统的制品的开放方法,但独立于任何具体的程序设计语言。应用场景UML可以对任何具有静态结构和动态行为的系统进行建模,而且适用于从需求规格描述直至系统完成后的测试和维护等系统开发的各个阶段最常用的是建立软件系统的模型描述非软件领域原创 2020-11-22 18:09:07 · 227 阅读 · 0 评论